Com a localização:
find . -type f -exec sh -c 'SHELL COMMAND' {} \;
Isso invoca SHELL COMMAND
em cada arquivo encontrado, por sua vez; o nome do arquivo é "$0"
. Assim:
find . -type f -exec sh -c '
mv "$0" "${0%/*}/$(printf "%s\n" "${0##*/}" | sha1sum | cut -d" " -f1)"
' {} \;
(Observe o uso de printf
em vez de echo
, caso você tenha um arquivo chamado -e
ou -n
ou alguns outros casos problemáticos que echo
manipula.)
Você pode tornar isso um pouco mais rápido chamando o shell em lotes.
find . -type f -exec sh -c 'for x; do
mv "$x" "${x%/*}/$(printf "%s\n" "${x##*/}" | sha1sum | cut -d" " -f1)";
done' _ {} +
No zsh, há uma maneira fácil de combinar todos os arquivos no diretório atual e em seus subdiretórios recursivamente. O .
qualificador de glob restringe as correspondências a arquivos regulares e D
inclui arquivos de ponto.
for x in **/*(.D); do mv …; done
No bash ≥4, você pode executar shopt -s globstar
e usar **/*
para corresponder todos os arquivos no diretório atual e em seus subdiretórios recursivamente. Você precisará filtrar arquivos regulares no loop.
shopt -s globstar; GLOBIGNORE=".:.."
for x in **/*; do if [[ -f $x ]]; then mv …; done