2011-10-09 136 views
1

我正好需要用下面的shell腳本關於shell腳本

find . -type f -exec sh -c ' 
mv "$0" "${0%/*}/$(printf "%s\n" "${0##*/}" | sha1sum | cut -d" " -f1)" 
' {} \; 

但我不明白,此腳本是如何工作的?例如,如何分析

mv "$0" "${0%/*}/$(printf "%s\n" "${0##*/}" | sha1sum | cut -d" " -f1)" 
' {} \; 

一片一片地?謝謝。

回答

2
printf "%s\n" "${0##*/}" 

${0##*/}所採取的路徑$0和剝去任何領先的目錄名,只留下文件名。 printf命令增加一個新行到結束,然後該文件名通過管道輸送到...

| sha1sum | cut -d" " -f1 

此計算文件名的SHA-1散列,然後使用cut從SHA1SUM的輸出只提取散列。

${0%/*} 

這是${0##*/} —相反這一個從$0得到目錄和扔掉的文件名。

那麼有效,什麼最後還是會跑是:

mv "$DIR/$FILENAME" "$DIR/$HASH_OF_FILENAME" 

在英語中,它重命名每一個它找到原始文件名的SHA-1散列文件。


對於它的價值,它可以被簡化一點,並提高可讀性。我可能會寫mv命令爲:

mv "$0" "$(dirname "$0")/$(basename "$0" | sha1sum | awk "{print \$1}")