Como renomear todos os arquivos com caracteres especiais e espaços em um diretório?

7

Como posso renomear todos os arquivos em um diretório específico onde os arquivos contêm espaços em branco e caracteres especiais ($ e @) em seus nomes?

Eu tentei o comando rename da seguinte maneira para substituir todos os espaços e caracteres especiais por um _:

$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]


$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]
$

O comando funciona, mas não fará alterações nos nomes dos arquivos e também não retornará nenhum erro. Como pode consertar isso e existem outras maneiras também?

    
por Ankit Vashistha 17.07.2015 / 09:57

6 respostas

0

Como o comando rename não funcionou para mim por motivos desconhecidos e não obtive outras respostas para a minha pergunta, eu mesmo tentei fazer a renomeação possível. Isso pode não ser a melhor abordagem para renomear os arquivos, mas funcionou para mim e é por isso que gostaria de publicá-lo como resposta para que, se alguém mais ler isso, possa obter alguma ajuda para alterar os nomes dos arquivos da maneira que fiz.

Agora, para mim, eu sei que todos os arquivos terão um texto específico em seus nomes, que é a palavra "Bloco". A seguir estão os nomes dos arquivos antes de sua renomeação ser feita:

anks@anks:~/anks$ ls -lrt
total 4
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks   0 Jul 25 14:48 Bharti TRX Block [email protected]

Agora eu escrevi um pequeno script de shell para tornar isso possível. A seguir está o código:

#!/bin/bash

PATH="/home/ebfijjk/anks"

# Put the old filenames in a file.
ls $PATH | grep Block >> oldValues

# Put the new names without " " or "@" or "$" in another file
cat oldValues | sed 's/\$/_/g' | sed 's/\@/_/g' | sed 's/ /_/g' >> newValues

# Create a new file with Old names and New names seperated by a #.
paste -d'#' oldValues newValues >> oldAndNew

# Read the file with both old and new names and rename them with the new names.
while IFS='#'; read oldValue newValue
do
    mv "$oldValue" "$newValue"

done < oldAndNew

rm oldValues newValues oldandNew

E é isso, quando executo o script, ele renomeia todos os nomes de arquivos com espaços em branco ( ) ou $ ou @ com _ em vez desses caracteres.

    
por 25.07.2015 / 13:06
7

O sinalizador -n é para

--no-act

No Action: show what files would have been renamed.

Portanto, é normal que você não tenha alterações.

Em relação ao seu comando, está funcionando para mim:

$ touch "a @ test"
$ ls
a @ test
$ rename -n 's/ |\$|@/_/g' *
a @ test renamed as a___test

Talvez dependendo do seu escudo, você tenha que escapar do |

$ rename -n 's/ \|\$\|@/_/g' *

Ou você pode usar a notação […] para agrupar caracteres:

$ rename -n 's/[ @\$]/_/g' *
    
por 17.07.2015 / 10:06
3

Você poderia tentar assim:

for file in ./*Block*                                       
do echo mv "$file" "${file//[ ()@$]/_}"
done

Se você estiver satisfeito com o resultado, remova o echo antes de mv para realmente renomear os arquivos.

    
por 22.02.2017 / 01:00
1

Este apenas tira os caracteres especiais dos nomes dos arquivos

for file in *; do mv "$file" 'echo $file | tr -cd '.A-Za-z0-9_-'' ; done
ॐNámásté Egész-ség.mkv --> NmstEgsz-sg.mkv

coloque echo após ; do para testar antes, como:

for file in *; do echo mv "$file" 'echo $file | tr -cd '.A-Za-z0-9_-'' ; done

Outra solução:

rename -v 's/[^a-zA-Z0-9\.\s_-]//g' *.* && rename -v 's/[\s]/_/g' *.*
ॐNámásté Egész-ség.mkv --> Nmst_Egsz-sg.mkv

-n opção para testar antes.

    
por 05.11.2017 / 03:38
0

Eu tenho procurado por uma solução para este problema por um tempo agora. Eu trabalho em sistemas fechados antigos 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:30
0

procurando um script bonito para remover caracteres especiais, assim como caracteres especiais alemães, substituindo-os por caracteres universais para não remover informações úteis Atualizei a última versão do script que teve alguns problemas menores que resultaram em:

#!/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'  '
  outfileNOSPECIALS='echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g''
  outfileNOoe='echo $outfileNOSPECIALS| sed -e 's|ö|oe|g''
  outfileNOae='echo $outfileNOoe| sed -e 's|ä|ae|g''
  outfileNOue='echo $outfileNOae| sed -e 's|ü|ue|g''
  outfileNOOE='echo $outfileNOue| sed -e 's|Ö|OE|g''
  outfileNOAE='echo $outfileNOOE| sed -e 's|Ä|AE|g''
  outfileNOUE='echo $outfileNOAE| sed -e 's|Ü|UE|g''
  outfileNOss='echo $outfileNOUE| sed -e 's|ß|ss|g''
  outfile=${outfileNOss}
  if [ "$infile" != "${outfile}" ]
  then
        echo "filename changed for " $infile " in " $outfile
        mv "$infile" ${outfile}
  fi
done

exit

resultando em:

@don_crissti: Ele está fazendo o hokus-pokus com o infil, já que o linux teria seus próprios problemas ao manipular caracteres especiais ao mover o nome do arquivo.

    
por 22.02.2017 / 00:50