Use isto:
find -name "* *" -print0 | sort -rz | \
while read -d $'find -name "* *" -print0 | sort -rz | \
while read -d $'%pre%' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
find
procurará arquivos e pastas com um espaço no nome. Isso será impresso ( -print0
) com nullbytes como delimitadores para lidar com nomes de arquivos especiais também.
O sort -rz
inverte a ordem dos arquivos, para que os arquivos mais profundos de uma pasta sejam os primeiros a serem movidos e a própria pasta seja a última. Portanto, nunca há pastas renomeadas antes que todos os arquivos e pastas sejam renomeados.
Finalmente, o comando mv
renomeia o arquivo / pasta. No nome do alvo, apenas removemos os espaços do nome base dos arquivos, senão não seria mais acessível.