저는 그래픽 디자인 분야에서 일하고 있습니다. 다양한 웹사이트에서 많은 파일( EPS
문서, PSD
파일 등) 을 다운로드했습니다 .
다양한 웹사이트에서 제공되기 때문에 10개가 넘는 웹사이트에서 다운로드한 후 동일한 크기의 동일한 파일이 많이 생성되고 모든 것이 동일하지만 파일 이름이 다릅니다(동일한 파일의 복사본 2~4개). 중복을 제거하기 위해 수동으로 하나씩 여는 것은 매우 시간이 많이 걸립니다
다운로드한 모든 파일의 이름을 다른 파일의 고유한 이름으로 바꾸는 방법이 있었으면 좋겠습니다(새 이름이 설명적이지 않아도 괜찮습니다).
예를 들어, 2개의 동일한 파일( nice-sun.eps
사이트 1에서 다운로드한 파일과 678.eps
사이트 2에서 다운로드한 파일)입니다. 이름을 바꾸면 파일 이름이 동일해집니다.
답변1
이 명령은 모든 파일의 이름을 해당 내용의 md5sum으로 바꿉니다. 즉, 동일한 내용을 가진 파일은 동일한 이름을 갖게 됩니다.
for f in *; do mv $f $(md5sum $f | cut -d " " -f 1); done
명령에서 로 바꿀 수 있습니다 md5sum
.sha1sum
이 데모에서는 이름이 바뀌는 것을 확인할 수 있도록 -v
몇 가지 항목을 추가했습니다 .mv
$ echo 1 > a
$ echo 2 > b
$ echo 1 > c
$ ls -1
a
b
c
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
`a' -> `b026324c6904b2a9cb4b88d6d61c81d1'
`b' -> `26ab0db90d72e28ad0ba1e22ee510510'
`c' -> `b026324c6904b2a9cb4b88d6d61c81d1'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
일부 파일에는 동일한 파일 이름이 있고 다른 파일에는 그렇지 않은 디렉터리에서 이 명령을 안전하게 실행할 수도 있습니다.
$ echo 1 > d
$ echo 2 > e
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
d
e
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
mv: `26ab0db90d72e28ad0ba1e22ee510510' and `26ab0db90d72e28ad0ba1e22ee510510' are the same file
mv: `b026324c6904b2a9cb4b88d6d61c81d1' and `b026324c6904b2a9cb4b88d6d61c81d1' are the same file
`d' -> `b026324c6904b2a9cb4b88d6d61c81d1'
`e' -> `26ab0db90d72e28ad0ba1e22ee510510'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
여전히 해시된 파일의 해시를 계산합니다. 따라서 파일이 큰 경우 재해싱을 방지하는 것이 좋습니다.
답변2
rename-hash
다음은 확장자를 변경하지 않고 파일 이름을 해시 합계로 바꾸는 데 사용하는 스크립트 입니다 . 이름을 바꿀 파일 목록을 인수로 사용합니다. -n
테스트 실행을 위한 첫 번째 매개변수 로 사용됩니다 .
#!/bin/sh
unset DRY
[ "$1" == "-n" ] && { DRY=1; shift; }
for i in $@; do
if [ -f "$i" ]; then
HASHSUM=$(md5sum "$i" | sed 's/\(..........\).*/\1/')
DIR=$(dirname "$i")
BASE=$(basename "$i")
EXT=$(echo "$BASE" | sed -n 's/[^.]*\(\..*\)/\1/p')
TARGET="$DIR"/"$HASHSUM""$EXT"
if [ "$TARGET" != "$DIR/$BASE" ]; then
if [ -n "$DRY" ]; then
echo will rename "$i" to "$TARGET"
else
mv "$i" "$TARGET"
fi
fi
fi
done
예:
$ rename-hash -n *
will rename test.pdf to ./f604d0d6ad.pdf
will rename images.tar.gz to ./d41d8cd91b.tar.gz
답변3
중복 항목을 찾을 수 있는 유틸리티가 있습니다. find 및 md5sum을 사용할 수 있지만 시간이 꽤 걸릴 수 있습니다.
나는 보통 사용한다레플리카그런 이유로. 모든 중복 항목을 찾아 해당 이름을 표준 출력으로 인쇄할 수 있는 경우. 나중에 출력을 구문 분석하고 원하는 경우 모든 파일의 이름을 바꾸거나 삭제할 수도 있습니다.