무려 700GB에 달하는 이 폴더가 있는데 해당 파일 중 일부가 중복되었습니다. 그들 중 다수는 동일한 이름을 갖고 있으며 일부는 중복되고 일부는 중복되지 않습니다. 기본적으로 해당 폴더 옆에는 파일과 더 많은 폴더로 가득 찬 약 30개의 폴더가 있습니다. 이 700GB 폴더의 모든 파일을 재귀적으로 가져와 다른 디렉터리에 비재귀적으로 복사하고 싶습니다. 모든 충돌은 크기에 따라 처리됩니다. 두 파일의 이름이 같고 크기가 같으면 파일을 건너뛰지만, 두 파일의 이름이 같고 크기가 다르면 두 파일이 모두 유지됩니다. 어떤 방법으로든 할 수 있나요?
답변1
dupes의 이름을 바꿔야 하기 때문에 질문이 복잡하지만이름이 변경됨dupes는 이전에 "fellows"로 이름이 변경된 모든 (아마도) 크기별로 확인해야합니다.
기능
내가 볼 수 있고 테스트한 바에 따르면 아래 스크립트가 이를 수행합니다. 가능한 중복 항목의 이름을 등 [dupe_1]<file>
으로 바꾸고 [dupe_1]<file>
(크기가 다른 경우) 각 이름을 바꾼 후에 파일 크기가 이동된 복제 파일이나 대상 디렉터리의 이름이 바뀐 버전과 일치하는지 확인합니다.
#!/usr/bin/env python3
import shutil
import os
#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---
def check_dupe(src, trg):
return os.stat(src).st_size == os.stat(trg).st_size
for root, dirs, files in os.walk(dr):
for file in files:
# define src, target
src = root+"/"+file; trg = dr2+"/"+file
if not os.path.exists(trg):
# if target does not exist: move file
shutil.copy(src, trg)
else:
n = 1
# rename the file, check after every renaming if file exists, if size differs
while os.path.exists(trg):
test = check_dupe(src, trg)
if test != True:
trg = dr2+"/[dupe_"+str(n)+"]"+file
n += 1
else:
break
if test != True:
shutil.copy(src, trg)
사용하는 방법
- 스크립트를 빈 파일에 복사하고 다른 이름으로 저장하세요.
reorganize.py
- 스크립트의 헤드 섹션에서 소스 및 대상 디렉터리의 경로를 설정합니다.
다음 명령으로 실행하세요.
python3 /path/to/reorganize.py
노트
- 먼저 작은 샘플로 테스트해 보세요.
- 이렇게 하면거대한노틸러스가 탐색할 수 없는 "플랫" 디렉토리입니다.
답변2
이 시도:
cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
if [ -e [destination_folder]/"$file" ]; then
if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
false
else
cp "$file" [destination_folder]/"$file"...
fi
else
cp "$file" [destination_folder]/
fi
echo "$file copied"
done