Ferramentas Unix: e se um arquivo for nomeado menos algo?

9

Estou sempre me perguntando: a maioria das ferramentas GNU / Unix aceita opções no formato "menos algo", às vezes seguido por um argumento. E se você tiver um arquivo chamado menos alguma coisa?

$ ls
-f
$ rm -f
$ ls
-f
$ mv -f abc
mv: missing destination file operand after `abc'
Try `mv --help' for more information.
$ cat -f
cat: invalid option -- 'f'
Try `cat --help' for more information.

ou

$ ls
-ohello.c
$ gcc -ohello -ohello.c
gcc: fatal error: no input files
compilation terminated.

Isso é apenas por curiosidade; Eu não tenho um caso de uso para isso.


fonte
Você precisa encontrar uma maneira de passar literalmente a string "-f" para a chamada do sistema. Normalmente, isso é por uma fuga cuidadosa.
Flexo
2
Para o eleitor de 'fechar porque está fora do tópico': esta é uma pergunta sobre programação de shell e como evitar um problema. É totalmente sobre tópico para SO. (OTOH, é provavelmente uma duplicata; o problema é encontrar a outra questão relevante.)
Jonathan Leffler
possível duplicata de Como excluir um arquivo chamado "-p" do bash?
user1686

Respostas:

12

Para remover um arquivo chamado -x, use rm -- -x( --significa o fim das opções) ou rm ./-x.

Dan D.
fonte
10

É bastante comum fazer esse tipo de pergunta nas configurações da entrevista. Uma maneira comum de lidar com arquivos com traços é:

$ rm -- -f
$ rm ./-f
William Pursell
fonte
6

Uma pergunta comum no Unix. A principal maneira é fornecer o nome completo do caminho para o arquivo, para que ele não tenha um traço na frente:

$ rm -file.txt
unknown option -l

$ rm ./-file.txt    #No problem!
$ rm $PWD/-file.txt #Same thing

Em alguns comandos, você pode usar um traço sozinho (ou um traço duplo) para finalizar as opções. No entanto, isso não é necessariamente verdade com todos os comandos ou mesmo com o mesmo comando em sistemas diferentes.

$ rm -- -file.txt   #Works on Linux but not on some Unix systems
David W.
fonte
4

você tem que usar

  rm -- <filename>

Ex:

  rm -- -f
Sentou
fonte
Alguma observação não estaria errada.
usuário desconhecido