Use isso com bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
procurará arquivos com um espaço no nome. Os nomes de arquivos serão impressos com um nullbyte ( -print0
) como delimitador para também lidar com nomes de arquivos especiais. Em seguida, o read
built-in lê os nomes de arquivos delimitados pelo nullbyte e, finalmente,mv
substitui os espaços por um sublinhado.
EDIT: Se você deseja remover os espaços nos diretórios também, é um pouco mais complicado. Os diretórios são renomeados e, em seguida, não são mais acessíveis pelo nome find
encontrado. Tente o seguinte:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
A sort -rz
inverte a ordem de arquivo, para que os arquivos mais profundos em uma pasta é o primeiro a se mover e a própria pasta será a última. Portanto, nunca há pastas renomeadas antes que todos os arquivos e pastas sejam renomeados dentro dela. O mv
comando no loop também é um pouco alterado. No nome do destino, removemos apenas os espaços no nome de base do arquivo, caso contrário, ele não estaria acessível.
find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Usando
rename
ou com
$1
Usando
mv
ou com
$1
fonte
Este é um método que encontrei ao enfrentar o mesmo problema:
Eu estava escrevendo um arquivo de script bash para atualizar automaticamente meus certificados ssl.
fonte
Use
rename
:Não há necessidade de
find
:)fonte