Removendo caracteres ilegais com o Automator

1

Eu tenho tentado escrever um serviço Mac Automator para remover caracteres ilegais de nomes de arquivos. Eu tenho isso funcionando, mas a solução é um pouco deselegante e eu queria saber se alguém teria uma solução melhor.

Estou executando o seguinte script Bash que tem o arquivo selecionado passado para ele como um argumento.

for f in "$@"
do

cd $(dirname "$f")
mv "${f##*/}" $(echo "${f##*/}" | sed -e 's/[^A-Za-z0-9._-]/_/g')

done

Ele faz isso

cd /Desktop/test/
mv some file %^& test.txt some_file_____test.txt

cd 'no diretório era a única maneira de eu conseguir que o mv funcionasse. Não seria possível localizar o arquivo ou renomear o caminho de arquivo inteiro, ou seja,

/Desktop/test/some file %^& test.txt to _Desktop_test_some_file_____test.txt
    
por byrnec25 18.02.2015 / 12:43

1 resposta

0

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
    
por 18.02.2015 / 12:54