Como posso renomear todos os arquivos em um diretório específico em que os arquivos contêm espaços em branco e caracteres especiais ($ e @) em seus nomes?
Tentei o rename
comando 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 Morning$AP@20150716.csv
$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv
$
O comando funciona, mas não fará nenhuma alteração nos nomes dos arquivos e também não retornará nenhum erro. Como resolver isso e também existem outras maneiras?
linux
shell-script
rename
Ankit Vashistha
fonte
fonte
Respostas:
A
-n
bandeira é paraPortanto, é normal se você não tiver nenhuma alteração.
Em relação ao seu comando, ele está funcionando para mim:
Talvez, dependendo do seu shell, você precise escapar do |
Ou você pode usar a
[…]
notação para agrupar caracteres:fonte
rename -n 's/./_/g' *
produz alguma coisa?Você pode tentar assim:
Se você estiver satisfeito com o resultado, remova o
echo
antesmv
para renomear os arquivos.fonte
procurando um script bonito para remover caracteres especiais e caracteres especiais alemães, substituindo-os por universais para não remover informações úteis Atualizei a última versão do script, que teve alguns problemas menores, resultando em:
resultando em:
@don_crissti: Ele está fazendo o hokus-pokus com o infile, já que o linux tem seus próprios problemas ao lidar com caracteres especiais ao mover o nome do arquivo.
fonte
Como o
rename
comando não funcionou para mim por motivos desconhecidos e não recebo outras respostas para minha pergunta, tentei fazer um esforço para tornar a renomeação possível. Essa pode não ser a melhor abordagem para renomear os arquivos, mas funcionou para mim e é por isso que eu gostaria de publicá-la como resposta, para que, se alguém mais ler isso, obtenha ajuda para alterar os nomes dos arquivos da maneira que eu fiz.Agora, para mim, eu sei que todos os arquivos terão um texto específico em seus nomes, que é a palavra "Bloquear". A seguir, estão os nomes dos arquivos antes de sua renomeação ser concluída:
Agora eu escrevi um pequeno script de shell para tornar isso possível. A seguir está o código:
E é isso, quando executo o script, ele renomeia todos os nomes de arquivos com espaços em branco (
) ou
$
ou@
com_
esses caracteres.fonte
cat foo | sed S1 | sed S2 | sed S3 >> bar
porsed -e S1 -e S2 -e S3 foo >> bar
sed 's/[ ()@$]/_/g'
oused 'y/ ()@$/_____/'
Este apenas tira os caracteres especiais dos nomes de arquivos
colocar
echo
depois; do
para testar antes, como:Outra solução:
-n
opção para testar antes.fonte
Estou procurando uma solução para esse problema há algum tempo. Eu trabalho em sistemas fechados antigos que não podem ter novos pacotes instalados. Eu não tenho o
rename
comando. Finalmente, escrevi um script que parece funcionar com todos os caracteres especiais inseridos no teclado.~@#$%^&*()-_=+[]{}\|;:",<.>?'
O script renomeará todos os arquivos e diretórios no diretório atual. Ele substituirá todos os caracteres especiais, exceto-_.
pelo_
caractere. Aoutfile=
linha pode ser modificada para usar um caractere diferente para substituição, se desejado. Substitua|_|
por|.|
para usar o.
caractere, por exemplo.fonte
Para mim, no Ubuntu 18.04 LTS com o bash 4.4.20 (1), libere este one-liner funcionou bem para remover espaços, @,: # ...
Para testar (observe o
echo
comando:Executar:
fonte