Tente:
$ for file in *; do [ -f "$file" ] && ( mv "$file" "$(echo $file | sed -e 's/ /_/g')" ); done
Eu tenho um monte de arquivos em um diretório com 'espaços' no nome do arquivo.
Como faço para renomear em massa todos os nomes de arquivos com 'espaços' e substituí-los por um caractere '_'.
Olhando para as outras soluções, tentei o seguinte comando sem sucesso:
find . -name '* *' -exec rename ' ' '_' {} +
find: rename: não existe esse arquivo ou diretório
Tente:
$ for file in *; do [ -f "$file" ] && ( mv "$file" "$(echo $file | sed -e 's/ /_/g')" ); done
Não há resposta direta, mas a maioria das pessoas vai errar de uma forma ou de outra. Provavelmente, eles não usarão o find corretamente, e você poderá obter resultados estúpidos se qualquer nome de arquivo contiver um ^ J.
Além disso, se você tiver / lotes / de arquivos, provavelmente não desejará que seu script crie um sed ou mv para cada entrada.
Aqui está uma maneira de fazer isso corretamente com o Perl básico:
find . -print0 | \
perl -e '$/="find . -print0 | \
perl -e '$/="%pre%0";' -ne '$o=$_;tr/ /_/;rename($o,$_);'
0";' -ne '$o=$_;tr/ /_/;rename($o,$_);'
Obrigado pelas respostas.
Eu encontrei este forro que fez o truque:
for i in *\ *; do if [ -f "$i" ]; then mv "$i" ${i// /_}; fi; done
Tags bash