我開始編寫一個簡單的 bash shell 腳本,使用 SHA1 偵測匹配項來尋找給定目錄中的重複檔案。一切正常,直到我遇到帶空格的檔案名稱。檢測仍然有效,但在輸出中空格將轉換為換行符。
劇本...
#!/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 哈希值,然後解析出一些不必要的輸出並繼續對哈希值列表進行排序和迭代。您沒有在貼文中指定作業系統標籤,但您使用的/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
,但希望上面的修訂能幫助您入門。