2011-10-09 86 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}")