중복 파일을 찾아 하나의 복사본을 다른 드라이브로 이동하고 다른 모든 복사본을 삭제합니다.

중복 파일을 찾아 하나의 복사본을 다른 드라이브로 이동하고 다른 모든 복사본을 삭제합니다.

사실 저는 두 가지 다른 일을 하려고 노력하고 있어요.

첫 번째는 중복 항목을 제외하고 모든 비디오 파일, 사진 및 문서를 여행용 하드 드라이브에 복사하는 것이었습니다. 그래서 여행용 하드 드라이브에는 사본이 하나만 있습니다. 여러 수준의 폴더(ntfs 파일 시스템)를 볼 수 있어야 합니다. 두 번째는 원본 파일의 복사본을 소스에, 복사본을 여행용 드라이브에 남겨두고 소스에서 중복된 파일을 모두 제거하면서 이러한 모든 파일의 복사본을 전송하는 것입니다. 이는 서로 다른 두 시스템에 대한 것이므로 두 개의 유사한 요청이

특정 파일 형식(인코딩 비교 또는 .xyz 확장자를 통해)으로 제한하고 파일이 해시되어 중복이 있는지 확인하고 싶습니다.

내 필요는 중복 파일 찾기 기능과 다른 미디어로의 자동 전송/복사를 결합하는 것입니다...바람직하게는 한 단계에서.

그런 도구가 있나요? 아니면 명령줄을 사용하여 이 작업을 어떻게 수행합니까?

답변1

fdupes한 가지 아이디어는 및 의 조합을 사용하는 것입니다 rsync.

  1. 전송을 고려 중인 모든 파일에 대한 준비 영역을 만드는 데 사용됩니다 rsync.
  2. 준비 영역에 있는 항목을 제외한 모든 중복 항목을 제거합니다(만).
  3. 다시 사용하세요. 스테이징의 나머지 파일을 대상으로 전송하세요 rsync.

이를 위해서는 세 가지 위치가 필요합니다.

  1. 원본 파일, 디렉토리 경로는 $origdir.
  2. 스토리지 캐시, $stagingdir.
  3. target, 의 로컬 또는 원격 경로입니다 $destdir.

먼저 준비 영역을 만듭니다(이것은 준비 영역이 아직 존재하지 않거나 존재하는 경우 전송해야 할 항목만 포함한다고 가정합니다).

rsync --archive --verbose --link-dest="$origdir" \
    --include="*.jpg" --include="*/" --exclude="*" \
    "$origdir/" "$stagingdir"

.jpg그러면 원래 위치에서 하드 링크가 생성되어 이름으로 끝나는 모든 파일이 준비 영역에 복사됩니다. 디렉토리 구조를 생성하는 데는 공간만 필요하며 파일 데이터는 중복되지 않습니다( $stagingdir$origdir두 개의 다른 파티션에 있지 않는 한). 추가 파일 이름 패턴을 추가하려면 더 많은 --include옵션(앞으로이것 --exclude).

그런 다음 fdupes다음을 실행하십시오 $stagingdir.

fdupes --delete --recurse "$stagingdir"

삭제하기 전에 대화식으로 확인을 요청합니다. --noprompt확인 없이 파일을 삭제하는 옵션 도 있습니다. fdupes설명서를 읽어주세요주의 깊은. $origdir준비 영역에서 파일을 삭제해도 아래 파일에는 영향을 미치지 않습니다.

그런 다음 준비 디렉터리에서 빈 디렉터리를 삭제합니다(이는 추가 단계이며 약간만 정리합니다).

find "$stagingdir" -type d -empty -delete -print

그러면 전체 준비 영역을 탐색하고 빈 디렉터리가 모두 제거됩니다. 성공적으로 삭제되면 삭제된 디렉터리가 모두 인쇄됩니다.

마지막으로 중복되지 않은 항목을 전송합니다.

rsync --archive --verbose "$stagingdir/" "$destdir"

이 프로세스는 첫 번째 프로세스에서 사용된 패턴과 일치하는 파일의 원래 디렉터리 구조를 보존하고 중복 항목이 제거된 rsync후에도 그대로 유지됩니다 .fdupes

관련 정보