Espaços em nomes de arquivos são maus.
Eu vejo três problemas com o script.
1) ao fazer o loop for...
, você terá dois valores diferentes quando encontrar um arquivo com espaço. ou seja, se você tiver os arquivos "file1 1.jpg"
e "file2 2.jpg"
e fizer:
for i in $(find . -type f -name \*.jpg); do
echo $i
done
Você terá
./file1
1.jpg
./file2
2.jpg
porque o shell quebra o argumento em espaços. A saída do comando $(find ...)
será
./file1 1.jpg
./file2 2.jpg
Quais são quatro palavras para o comando for
a ser atribuído em $i
--- por padrão, o shell trata os espaços e as novas linhas da mesma maneira quando expande.
Você pode contornar isso alterando o char IFS .
Sua primeira linha poderia parecer:
IFS=$'\n' find $DIRECTORY -type f -name \*.jpg | while read -r imgfile; do
2) você está alimentando o loop for com um único nome de arquivo, então você deve dizer:
rename -f 's/ /_/g' "$imgfile"
caso contrário, *.jpg
é expandido no diretório atual, e não em $DIRECTORY
(e observe as aspas - dado que $imgfile
terá espaços).
3) mesmo assim, se $DIRECTORY
tiver algum componente de caminho com espaços, a renomeação falhará (haverá diretórios intermediários que não existem).
4) sugestão (mantendo simples):
DIRECTORY="/foo/bar"
cd $DIRECTORY
rename -f 's/ /_/g' *.jpg
não faz o que você quer?
adicionado : meu script (criado há muito tempo, quando não havia rename
no Unix), é isso --- ele removerá espaços e tabs em todos os arquivos no diretório atual que os tenham no nome:
#
ls -1 | grep -E " |\t" | while read i; do
a='echo $i | tr " \t" "__"'
mv -v "$i" $a
done
adicionado ++ : este link encontrei pesquisando esta resposta é excelente.