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