명령줄에서 파일을 복사하는 데 도움이 필요합니다.

명령줄에서 파일을 복사하는 데 도움이 필요합니다.

무려 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)

사용하는 방법

  1. 스크립트를 빈 파일에 복사하고 다른 이름으로 저장하세요.reorganize.py
  2. 스크립트의 헤드 섹션에서 소스 및 대상 디렉터리의 경로를 설정합니다.
  3. 다음 명령으로 실행하세요.

    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

관련 정보