Renomeando arquivos com caracteres especiais

Publicado por Andre Luiz Facina em 14/07/2008

[ Hits: 21.376 ]

 


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

Alteração de encoding em sistemas Debian

AIX - Identificando portas abertas

AIX - Montar imagem ISO

Hardening no OpenBSD

Replicação no LDAP com slurp

Leitura recomendada

Os poderes do ".bash_history"

Querem ver os nomes dos usuários em uppercase?

Colocando seu lilo boot no disquete

TAR seletivo

Remover comentários

  

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