2011-10-09 4 views
1

J'arrive besoin d'utiliser le script shell suivantau sujet d'un script shell

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

Mais je ne comprends pas comment fonctionne ce script? Par exemple, comment analyser

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

pièce par pièce? Merci.

Répondre

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

${0##*/} prend le chemin $0 et des bandes hors des noms de répertoires de premier plan, ne laissant que le nom du fichier. La commande printf ajoute une nouvelle ligne à la fin et ce nom de fichier est canalisé vers ...

| sha1sum | cut -d" " -f1 

Ce calcule le hachage SHA-1 du nom de fichier et utilise ensuite cut pour extraire tout le hachage de la sortie de sha1sum .

${0%/*} 

C'est à l'opposé de ${0##*/} — celui-ci obtient les répertoires de $0 et jette le nom du fichier.

efficacement, ce qui finit par obtenir l'exécution est:

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

En anglais, il renomme tous les fichiers qu'il trouve le hachage SHA-1 du nom de fichier d'origine.


Pour ce que cela vaut, il pourrait être simplifié un peu et rendu plus lisible. Je pourrais écrire la commande mv comme:

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