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.
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