중복 파일 제거

중복 파일 제거

내 Mac OS X 10.6.7에서 iTunes는 내 음악 라이브러리의 모든 파일을 복사했습니다. 이제 1,920개가 아닌 3,840개의 파일이 있습니다. 문제는 iTunes가 단순히 전체 폴더를 복사하는 것이 아니라 각 폴더의 모든 파일을 복사하여 1복사본에 추가한다는 것입니다.

├── album1
│   ├── track1.mp3
│   ├── track1 1.mp3
│   ├── track2.mp3
│   └── track2 1.mp3
└── album2
    ├── track1.m4a
    └── track1 1.m4a

이제 1,920개의 중복 항목을 클릭하는 대신 터미널에 몇 가지 스마트 라인을 입력하여 중복 파일을 삭제하고 싶습니다.

find path/to/music/ -name "* 1.*" -delete

이는 대부분의 경우 작동하지만 다음과 같은 상황에서는 문제가 발생할 수 있습니다.

└── album2
    ├── track 1.mp3
    └── track 1 1.mp3

"* 1 1.*"나중에 이 파일을 제외하고 이름을 바꾸고, 중복된 파일을 삭제 해야 할까요 1?

어떻게 해야 하나요?

간단한 해결책이 있습니까?

답변1

나는 또한 이것을 성공적으로 찾고 삭제하기 위해 추가할 것입니다.정밀한파일이 중복되었습니다. 해시 값으로 파일을 비교해야 합니다.

#!/bin/sh -eu
find "${1:-.}" -type f ! -empty -print0 | xargs -0 md5 -r | \
    awk '$1 in a{sub("^.{33}","");printf "%s\0",$0}a[$1]+=1{}' | \
    xargs -0 rm -v --

다른 이름으로 저장 deldupes.sh하고 실행하여 디렉터리 이름을 첫 번째 인수(그렇지 않으면 $PWD사용됨)로 전달합니다.

OS X에서 테스트되었으며 긴 공백 파일 이름에서 작동합니다.

답변2

이와 같은 것은 테스트되지 않았으므로 일부 구문을 변환해야 할 수도 있습니다.

IFS=$'\n'              # so that only newlines separate words, not spaces
set -f                 # disable globbing
FILES=$(find path/to/music/ -name "* 1.*")

for FILE in ${FILES}; do
    if [[ -f "${FILE% 1.*}" ]] ; do
        echo "Matched ${FILE}."
        # rm "${FILE}" # Uncomment me once you have confirmed it would do what you intend.
    fi
done

${FILE% 1.*}1.*마지막으로 일치하는 구문을 끝에서 제거하고 [[ -f ... ]]파일이 존재하는지 확인하여 끝에 구문이 없는 파일이 있는 파일을 제거합니다. 주석을 제거하기 전에 테스트하여 rm올바른지 확인하십시오.

관련 정보