Você poderia usar o dirname / basename para dividir sua variável $ f em $ fdir e $ fbase, e apenas editar $ fbase, e ficar fora do diretório, mas realmente não parece muito melhor do que o seu cd
solution ... (não pense que precisa da expansão de parâmetro para remover a parte da barra em $ fbase, então fica um pouco menor. Pode até ser capaz de usar substituição de padrão em vez de sed
, mas sed
já funciona tão bem o suficiente)
for f in "$@"
do
fbase=$(basename "$f")
fdir=$(dirname "$f")
mv "${fdir}${fbase}" "${fdir}$(echo "${fbase}" | sed -e 's/[^A-Za-z0-9._-]/_/g')"
done
Mas eu também estou querendo saber se o seu for f in "$@"
pode estar sendo pego com nomes de arquivos ilegais também, não separando o $ f apropriadamente sem algum uso de IFS, mas eu estou apostando que o Automator cuida disso. / p>
Outra opção pode ser executar find
e usar -exec
ou -execdir
ou mesmo xargs
para localizar & renomear arquivos, e há um programa rename
que pode fazer coisas como "converter nomes maiúsculos para menores, você usaria" rename 'y/A-Z/a-z/' *
, mas eles podem não funcionar bem com o Automator.
Na verdade, vou tentar um teste rápido para ver o que o rename
sozinho faz com um nome de arquivo com caminhos completos ... um inesperado "nenhum arquivo desse tipo" ao fazer o eco do caminho completo correto:
$ rename 'y/A-Z/a-z/' "/home/me/Downloads/NEWFILE-Z1.txt"
Can't rename /home/me/Downloads/NEWFILE-Z1.txt /home/me/downloads/newfile-z1.txt: No such file or directory
Não parece ser uma grande melhoria em relação a mv, but
rename 'poderia reduzir as subshells & pipes & ecos ...
$ rename -v 's/[^A-Za-z0-9._-]/_/g' New\ space\ file.txt
New space file.txt renamed as New_space_file.txt
Colocarei no script, menor, mas ele volta para cd
, e o "
de cotações funciona "ao redor" da subshell também:
for f in "$@"
do
cd $(dirname "$f")
rename 's/[^A-Za-z0-9._-]/_/g' "$(basename "$f")"
done