Renomeando arquivos com caracteres especiais

Publicado por Andre Luiz Facina em 14/07/2008

[ Hits: 22.483 ]

 


Renomeando arquivos com caracteres especiais



Se um arquivo possui caracteres especiais, o unix tentará interpretá-los. Para renomear esses tipos de arquivos não basta um simples "mv" (pois o shell retornará um erro), isso terá que ser feito com o número inode do arquivo.

Por exemplo:

$ ls -i "facina(unix)"

(o "-i" exibirá o número inode do arquivo -> 69734 facina(unix) )

O inode para esse arquivo é "69734".

Uma vez que o inode foi identificado, utilize o comando "find" para renomear o arquivo:

$ find . -inum 69734 -exec mv \{\} NewName \;

Depois "ls" novamente, a fim de verificar o arquivo.

Alguns podem dizer:

- Mas é mais fácil utilizar o mv com o nome do arquivo entre aspas (para quem utiliza o bash)

OK, mas lembre-se, nem todos os shells possuem essa facilidade. =)

André Facina

Outras dicas deste autor

Pfstat no OpenBSD 4.x

AIX - Montar imagem ISO

Ajustando o delay de repetição do teclado

Convertendo uma chave privada OpenSSL para uma chave pública/privada do OpenSSH

Migrando para o Ext4, o novo file system Linux

Leitura recomendada

Rodar um script no boot usando systemd

Abrindo aplicativos gráficos como usuário root logado como usuário comum sem kdesudo ou gksudo

Como ordenar arquivos por tamanho

openSUSE - Atualizando as entradas do GRUB 2

Contornando bug do Nautilus no Fedora

  

Comentários
[1] Comentário enviado por removido em 14/07/2008 - 23:25h

Num é mais fácil escapar o caractere especial, retirando assim a sua função e transformando-o em um mero caractere?

[2] Comentário enviado por netbug em 15/07/2008 - 13:31h

Olá lordhult, teria como fazer com a barra de escape sim, aliás, no linux tem mil e uma maneiras de fazer a mesma coisa, umas com um jeito mais simples, outras porém, mais complicadas. A escolha de uso varia de gosto e/ou necessidade de cada pessoa.



[3] Comentário enviado por DenisMata em 27/09/2020 - 19:48h

A necessidade de renomear arquivos é comum na hora de fazer cópias de arquivos entres discos com diferentes formatações (NFTS, Ext4 e etc), e para remover caracteres especiais em vários arquivos deve se proceder da seguinte forma. Por exemplo, vejamos com trocar o ":" por "___" no nome de todos os arquivos da pasta, e também das pastas, recursivamente [1]. Aqui foi escolhido 3 underlines porque é mais específico, o que permite que a operação possa ser revertida posteriormente. Primeiramente, apenas para ver quais os arquivos que serão afetados, sem fazer alterações, o comando a ser usado é:

find . -depth -execdir rename -n 's/:/___/g' {} +

.-depth faz a troca de trás pra frente na árvore de pastas, o que pode ser demorado mas evita problemas com a troca em nome de pastas. Depois de ver quais os arquivos que serão afetados, e para fazer as alterações, de fato, remova o parâmetro -n:

find . -depth -execdir rename 's/:/___/g' {} +

Para trocar vários caracteres especiais por um mesmo texto, por exemplo, trocar o ":" e "*" por "___", deve-se usar o seguinte comando:

find . -depth -execdir rename -n 's/[:*]/___/g' {} +

Esse procedimento, porém, atrapalha reverter o procedimento depois.

Espaço em branco no final do nome dos arquivos (chamado em inglês de trailing space) e quebra de linha também causam problemas. Nesse caso, usa-se o comando [2]:

find . -depth -execdir rename 's/'$'\n''| *$/g' {} +

O " *$" serve para eliminar os espaços em branco no final do nome dos arquivos e o "'$'\n''" para eliminar as quebras de linhas.

[1] https://stackoverflow.com/questions/52206158/replace-special-characters-recursively-bash
[2] https://askubuntu.com/questions/668088/remove-leading-or-trailing-spaces-in-file-or-folder-names



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts