나는 일치 항목을 검색하기 위해 SHA1을 사용하여 주어진 디렉터리 내에서 중복 파일을 찾기 위해 간단한 bash 쉘 스크립트를 작성하기 시작했습니다. 공백이 있는 파일 이름을 만날 때까지 모든 것이 작동했습니다. 감지는 여전히 작동하지만 출력에서는 공백이 줄 바꿈으로 변환됩니다.
스크립트는 ...
#!/bin/bash
export TARGET=$1
find $TARGET -type f -exec openssl sha1 \{\} \; > ./dupes.txt
COUNT=-1
for EVALUATION in `cat ./dupes.txt | sed 's/SHA1(\(.*\))\= \(.*\)$/\2 \1/' | awk '{print $1}' | sort | uniq -c | sort -nr`
do
if [[ $COUNT == -1 ]]
then
COUNT=$EVALUATION
else
HASH=$EVALUATION
if [[ $COUNT == 1 ]]
then
break
fi
echo "--- duplicate set ---"
for FILE in `grep $HASH ./dupes.txt | awk -F"[()]+" '{print $2}'`
do
echo "$FILE"
done
echo "---------------------"
COUNT=-1
fi
done
다음과 같이 스크립트를 실행하십시오.
./dupes.sh /home/dacracot/testDupes
다음과 같은 dupes.txt 파일이 생성됩니다.
SHA1(/home/dacracot/testDupes/lP3wj.jpg)= 324d91f412745481ed38aa184e5a56bfc3bf43b5
SHA1(/home/dacracot/testDupes/1673.gif)= 9c4029ec2e310f202b413d685209373d234e5465
SHA1(/home/dacracot/testDupes/.DS_Store)= b0ae6631a1412863f958da64091f4050005bf8d6
SHA1(/home/dacracot/testDupes/tae 2.svg)= 3ddc4fd6ae505bd01f370d0a018ef1f84b4d8011
SHA1(/home/dacracot/testDupes/tae.graffle)= 77f1ad6d695d944abacfe3a7f196be77125b6ef6
SHA1(/home/dacracot/testDupes/tae.svg)= 3ddc4fd6ae505bd01f370d0a018ef1f84b4d8011
SHA1(/home/dacracot/testDupes/22402_graph.jpg)= 24e5a25c8abf322d424dd5ce2e5b77381cd001c4
SHA1(/home/dacracot/testDupes/forwardcont.jpg)= 981e75060ae8e3aad2fe741b944d97219c8ccbe5
SHA1(/home/dacracot/testDupes/tae.svg.gz)= 922af5a5adbf7a4e7fd234aac7bcee2986133c4d
SHA1(/home/dacracot/testDupes/Alt2012.pdf)= 97d1fd997df9eb310b30a371c53883f5227cf10a
SHA1(/home/dacracot/testDupes/vcBZ8.jpg)= 7553c19fcb6aa159aada2e38066b5ba84465ee57
SHA1(/home/dacracot/testDupes/derm.graffle)= 0e1c4032f5f1fadc3a1643b2b77f816011c2d67f
SHA1(/home/dacracot/testDupes/WA.png)= 0e2e77624c3a76da4816f116665a041f6bdced2d
SHA1(/home/dacracot/testDupes/DRAW.GIF)= 6a8e4a2bf413e84140a0edeb40b475a5d3e4c255
SHA1(/home/dacracot/testDupes/crazyTalk.gif)= 1d938bbcb8cf09f30492df4504a50348cef7ea9d
그리고 마지막으로 다음과 같은 결과가 출력됩니다.
--- duplicate set ---
/home/dacracot/testDupes/tae
2.svg
/home/dacracot/testDupes/tae.svg
---------------------
하지만 첫 번째 파일에서 볼 수 있듯이 출력은 다음과 같아야 합니다.
--- duplicate set ---
/home/dacracot/testDupes/tae 2.svg
/home/dacracot/testDupes/tae.svg
---------------------
공백을 줄 바꿈으로 변경하는 것은 무엇입니까?
답변1
스크립트를 단순화하고 문제를 해결하기 위해 스크립트를 일부 수정해도 될까요?
OpenSSL을 사용하여 SHA1 해시를 계산한 다음 불필요한 출력을 구문 분석하고 해시 목록을 정렬하고 반복하는 것을 확인했습니다. 게시물에 OS 태그를 지정하지 않았지만 사용하면 /bin/bash
Linux를 제안하므로 대신 사용하지 않으시겠습니까 sha1sum
? 스크립트가 처리하기 더 쉬운 간단한 출력을 생성합니다. (BSD를 사용하는 독자는 sha1 -r
동등한 출력을 얻는 데 사용할 수 있습니다.)
#!/bin/bash
find "$1" -type f -exec sha1sum \{\} \; > dupes.txt
awk '{print $1}' < dupes.txt |
sort | uniq -c | sort -nr |
while read COUNT HASH; do
if [[ $COUNT == 1 ]]; then
break
else
echo "--- duplicate set ---"
grep "^$HASH " dupes.txt | sed -e "s/[^ ]* //"
echo "---------------------"
fi
done
find
의 -print0
옵션 및 을 사용하는 등 수행할 수 있는 추가 최적화가 있지만 xargs
위의 개정을 통해 시작할 수 있기를 바랍니다.