sha1은 스토리지 서버의 모든 이미지 파일을 집계하고 결과를 다음 형식의 텍스트 파일에 저장했습니다.
sha1sum 파일 이름
파일을 정렬하고 고유한 sha1sum 항목을 모두 제거했습니다. 그래서 나에게 남은 것은 중복 파일 목록입니다. 항목이 2개인 경우도 있고, 3개인 경우도 있고, 그 이상인 경우도 있습니다.
내가 하고 싶은 일은 삭제다.첫 번째만결과 출력을 사용하여 중복 파일을 제거하고 각 파일의 인스턴스 하나만 유지할 수 있도록 각 중복 sha1sum 항목
나중에 모든 파일을 어떤 형태의 디렉터리 계층 구조로 옮길 것이기 때문에 어떤 버전을 유지하는지는 별로 신경 쓰지 않습니다.
답변1
Linux 또는 Cygwin에서 GNU 유틸리티를 사용하면 uniq
동일한 해시 값을 사용하여 각 파일 블록을 분리할 수 있습니다. uniq
이 옵션을 호출하면 --all-repeated
프로세스 목록에서 고유 파일이 제거됩니다.
sha1sum * |
sort | uniq -w 40 --all-repeated=prepend |
sed -e '/^$/ { N; d; }' -e 's/^[^ ]* //' |
tr '\n' '\0' | xargs -0 rm --
이 간단하고 이식 가능한 스크립트에 대한 노력은 가치가 없습니다 awk
. 첫 번째 필드가 이전 줄의 첫 번째 필드와 동일하면 각 줄을 인쇄합니다. 이번에도 목록에서 고유한 파일이 제거됩니다.
sha1sum * |
sort |
awk '$1==h {print} {h=$1}' |
tr '\n' '\0' | xargs -0 rm --
이 작업을 수동으로 수행하는 대신 전화를 걸 수 있습니다.레플리카.
fdupes -f
답변2
당신은 또한 사용할 수 있습니다awk 'a[$1]++'
$ gsha1sum *
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file1
e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98 file2
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file3
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file4
$ gsha1sum *|awk 'a[$1]++'
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file3
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file4
Gilles가 게시한 명령과 마찬가지로 입력에서 첫 번째 필드가 한 번만 나타나는 줄도 제거됩니다.
a[$1]++
a[$1]++>0
또는 로 대체할 수 있습니다 ++a[$1]>=2
.