Isso não funcionará:
rename 's/ /-/g' 'find .'
Depois de executar o comando find, o shell faz a divisão de palavras nos resultados. Conseqüentemente, nenhum nome de arquivo com espaços sobrevive ao tato: ele é dividido em partes.
Você pode evitar isso usando:
rename 's/ /-/g' */*
Nesta forma de comando, o shell não faz a divisão de palavras e seu rename
será bem-sucedido. Este formulário funciona mesmo para nomes de arquivos com espaços, tabulações ou qualquer outro caractere difícil.
Como alternativa, use -exec
:
find . -name '* *' -exec rename 's/ /-/g' {} +
Este formulário funcionará com nomes de arquivos com espaços, tabulações ou quaisquer outros caracteres difíceis.
Demonstração
Para ver o que está errado, vamos criar um arquivo com espaços
$ touch "a b c"
$ find .
.
./a b c
Para esclarecer o que acontece, vamos criar uma função para colocar cada argumento que ele vê dentro de aspas duplas e exibi-lo:
$ display() { printf '"%s"\n' "$@"; }
Agora, podemos usar display
para ver o que acontece quando executamos find .
:
$ display 'find .'
"."
"./a"
"b"
"c"
Isso mostra a divisão de palavras em ação. O nome do arquivo a b c
foi dividido em três palavras separadas.