Use isso com bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'find -name "* *" -print0 | sort -rz | \
while read -d $'find $1 -name "* *.xml" -type f -print0 | \
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" "${f// /_}"; done
' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
' f; do mv -v "$f" "${f// /_}"; done
find
procurará arquivos com um espaço no nome. Os nomes dos arquivos serão impressos com um nullbyte ( -print0
) como delimitador para também lidar com nomes de arquivos especiais.
Em seguida, o read
builtin lê os nomes de arquivos delimitados pelo nullbyte e, finalmente, mv
substitui os espaços por um sublinhado.
EDIT: Se você quiser remover os espaços nos diretórios também, é um pouco mais complicado. Os diretórios são renomeados e não mais acessíveis pelo nome find
discover. Tente isto:
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. O comando mv
no loop também foi modificado. No nome do destino, apenas removemos os espaços no nome de base do arquivo, senão não seria acessível.