Como lote renomear arquivos removendo caracteres especiais sem usar renomear no shell linux

0

Por exemplo, eu tenho 100 arquivos e seus nomes têm espaço em branco. Um deles é " The Monkey King Return (2015).mkv ".

Como remover todos os espaços em branco no nome e substituir por caractere de ponto, também remover "(" e ")"?

O resultado deve ser " The.Monkey.King.Return.2015.mkv ".

como posso fazer isso em lote?

Na verdade, estou executando o shell script no meu Synology NAS via ssh, que é uma distribuição do BusyBox Linux com bash e ash instalado, sem o gcc. Já tentei por dias úteis, não consigo descobrir corretamente.

Ferramentas aviable: mv / xargs / sed / awk / outro padrão linux cmd.

Além disso, que tal recursivamente a renomeação de subpastas também?

Edit: acabou de instalar o apt-get e renomear o cmd para o meu synology nas usando o Debian Chroot do link , então está tudo bem agora.

Para tornar a pessoa que precisa de uma resposta simples, o cmd é:

find . -iname \*\ \*.\*|rename 's/\ /\./g'
    
por chenyi1976 07.06.2016 / 10:10

3 respostas

1

A maioria das distro linux incluem o util-linux que lhe dá o comando rename . Você pode fazer o que você solicita executando estes comandos:

rename ' ' _ *.mkv
rename '(20' 20 *.mkv
rename ').' . *.mkv

Você pode experimentar as opções, é bastante flexível. Se você quiser fazer isso recursivamente, combine rename com o comando find assim:

find . -type f -name \*.mkv -exec rename ' ' _ {} \;

Estes são explicados no manual; digite man find ou man rename para lê-los.

Cuidado com o fato de que algumas distros aparentemente incluem um comando diferente que aceita expressões regulares perl. Se o seu também precisar, você precisará de uma sintaxe ligeiramente diferente:

rename 's/\ /./g' *.mkv
rename 's/[\)\(]//g' *.mkv
    
por 07.06.2016 / 10:43
2

Se você não tem o comando rename , você pode fazer isso com um pequeno shell de script que ash do busybox também parece suportar (isto é recursivo):

find -type f -name \*.mkv | while read f; do
    n=${f/ /_} # replace spaces
    n=${n/(/}  # remove opening bracket
    n=${n/)/}  # remove closing bracket

    mv -v "$f" "$n"
done

Por favor, note que vai quebrar se os nomes das pastas também contiverem espaços ou colchetes.

    
por 08.06.2016 / 10:31
0

Eu tenho procurado por uma solução para este problema por um tempo agora. Eu trabalho em sistemas antigos e fechados que não podem ter novos pacotes instalados. Eu não tenho o comando rename . Por fim, escrevi um script que parece funcionar com todos os caracteres especiais inseridos pelo teclado: ~@#$%^&*()-_=+[]{}\|;:",<.>?'

O script renomeará todos os arquivos e diretórios no diretório atual. Ele substituirá todos os caracteres especiais, exceto -_. pelo caractere _ . A linha outfile= pode ser modificada para usar um caractere diferente para substituição, se desejado. Substitua |_| por |.| para usar o caractere . , por exemplo.

#!/bin/bash

for file in ./*
do
  infile='echo "${file:2}"|sed  \
         -e 's|"\"|"\"|g' \
         -e 's| |\ |g' -e 's|!|\!|g' \
         -e 's|@|\@|g' -e 's|*|\*|g' \
         -e 's|&|\&|g' -e 's|]|\]|g' \
         -e 's|}|\}|g' -e 's|"|\"|g' \
         -e 's|,|\,|g' -e 's|?|\?|g' \
         -e 's|=|\=|g'  '
  outfile='echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g''
  mv "$infile" ${outfile} &
done

exit
    
por 20.11.2016 / 22:26

Tags