De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Trabalhando com arquivos que possuem caracteres especiais

Colaboração: Emanuel Haine

Data de Publicação: 24 de julho de 2022

Às vezes nos deparamos com arquivos que possuem caracteres especiais, como por exemplo: *, !, #, $, &, |, ?, etc.

É importante lembrar que esses caracteres possuem um papel específico no shell.

Para mais informações, basta consultar a documentação.

Quando um arquivo é criado com esses caracteres, não podemos manipulá-los como se fosse um arquivo comum. Isso é devido ao fato do papel que eles desempenham dentro do shell.

Para isso, precisamos garantir que eles sejam intrepretados como uma string comum.

O trecho abaixo foi retirado do info do rm:

One common question is how to remove files whose names
begin with "-".  GNU "rm", like every program that uses the
"getopt" function to parse its arguments, lets you use the
"--" option to indicate that all following arguments are
non-options.  To remove a file called "-f" in the current
directory, you could type either:

     rm -- -f

or:

     rm ./-f

The Unix "rm" program's use of a single "-" for this
purpose predates the development of the "getopt" standard
syntax.

An exit status of zero indicates success, and a nonzero
value indicates failure.

Como vocês podem ver, não é nada complicado. Basta adicionar -- ou ./ para informar ao bash que esses caracteres são somente parte de uma string, e nada mais além disso.

Digamos que temos dois arquivos nessas condições

$ ls -l
total 0
-rw-rw-r--. 1 user group 0 Jul 11 23:39  --
-rw-rw-r--. 1 user group 0 Jul 11 23:41 '-3$%text--$&||--text'

Se eu tentar manipular esses arquivos usando a sintaxe padrão, a operação vai retornar um erro:

$ mv -- file
mv: missing destination file operand after 'old'
Try 'mv --help' for more information.

$ mv '-3$%text--$&||--text' file
mv: invalid option -- '3'
Try 'mv --help' for more information.

Agora, se eu usar -- ou ./ logo após o comando mv ou rm, ou qualquer outro comando relacionado, eu consigo executar minha operação com sucesso.

$ mv -- -- file
$ ls -l
total 0
-rw-rw-r--. 1 user group 0 Jul 11 23:41 '-3$%text--$&||--text'
-rw-rw-r--. 1 user group 0 Jul 11 23:39  file

$ rm -- '-3$%text--$&||--text'
$ ls -l
total 0
-rw-rw-r--. 1 user group 0 Jul 11 23:39 file



Veja a relação completa dos artigos de Emanuel Haine