Como excluo um arquivo cujo nome começa com “-” (hífen a.k.a. traço ou subtração)?

309

Como você remove um arquivo cujo nome de arquivo começa com um traço (hífen ou menos) - ? Eu sou ssh'd em um servidor OSX remoto e tenho esse arquivo no meu diretório:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

Como no mundo posso excluir --help de uma CLI? Esse problema é algo que me deparo de diferentes formas de vez em quando, esses arquivos são fáceis de criar, mas difíceis de se livrar.

Eu tentei usar barra invertida

rm \-\-help

Eu tentei citações

rm "--help"

Como evito que o caractere menos (traço ou hífen) seja interpretado como uma opção?

    
por Bryan Rehbein 02.09.2010 / 21:30

10 respostas

426

Use "-" para fazer com que o rm pare de analisar as opções da linha de comando, assim:

rm -- --help
    
por 02.09.2010 / 21:34
190

Ou você pode fazer

rm ./--help
    
por 03.09.2010 / 01:56
35

Use find para fazer isso:

find . -name '--help' -delete

E este é um bom método, porque se você tiver mais do que alguns arquivos como este que você pode excluir, você pode obter uma lista de visualização dos arquivos simplesmente executando find sem a opção -delete primeiro, e então se a lista de arquivos com boa aparência basta executá-lo novamente com -delete .

Na verdade, você está evitando rm em favor de find (especialmente com a prévia em primeiro lugar) é um bom hábito que ajudará a evitar erros com rm * que inevitavelmente o morderão algum dia.

Note, no entanto, que find irá recorrer através de todos os seus subdiretórios, então você pode querer executá-lo com uma restrição de profundidade de subdiretório como esta:

find . -maxdepth 1 -name '--help' -delete

que limita a localização ao diretório atual.

    
por 06.12.2011 / 02:44
19

As respostas de Vegar Nilsen e edfuh são muito boas e as soluções adequadas para um problema como este.

Eu quero adicionar uma resposta geral a essa pergunta que permite excluir qualquer arquivo com um nome de arquivo difícil. Primeiro, seu número de inode é obtido usando ls -i ou alguma forma de stat e, em seguida, o arquivo é removido procurando por arquivos no diretório atual pelo número de inode e executando o comando rm no arquivo com um número de inode correspondente

find . -inode <inode> -exec rm {}\;

Como os números de inode são únicos em cada sistema de arquivos, você pode remover qualquer arquivo usando isto; unicode ou usando caracteres de escape. É como sempre muito chato digitar, então eu recomendaria adicionar a linha

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

no seu arquivo .inputrc se você estiver usando o bash. Isso permite que você percorra a lista de possíveis conclusões ( para obter mais informações ).

    
por 20.09.2010 / 21:55
9

Uma solução brutal:

perl -e "unlink '--help' or die 'Could not unlink.';"

perl -e "rmdir '-d' or die 'Could not rmdir.';"
    
por 08.08.2012 / 21:34
8

Linux Passo a passo de criar um arquivo com traços e espaços e, em seguida, removê-lo.

TENHA CUIDADO! Não execute acidentalmente um rm -rf / ou um comando de exclusão em cascata semelhante.

Se o arquivo que você está tentando remover incluir asteriscos ou barras, não insira acidentalmente um . ou /* ou * ou algum outro caractere curinga que possa excluir o sistema operacional em cascata.

Crie um arquivo chamado "--yo yo"

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

Primeiro, encontre-o com o find:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

Certifique-se de que o comando de localização SÓ encontre o arquivo ONE que você deseja excluir:

Em seguida, passe a opção -delete para encontrar, para excluí-los:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Aaaannd ele se foi.

    
por 28.07.2014 / 17:06
2

Midnight Commander ( mc ) é o mais fácil, apenas aponte para ele e aperte F8;)

    
por 14.01.2012 / 16:53
0

aqui está uma solução que eu tinha usado antes de encontrar este segmento.
use vim para o diretório 'edit':

vim .

então (no vim) selecione o seu arquivo, aperte del e confirme a exclusão.
quando terminar, saia do vim com :q

    
por 12.04.2017 / 22:17
0

Você tentou adicionar o nome do diretório como prefixo:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

Usar o diretório como prefixo do arquivo em geral ajuda a evitar a interpretação incorreta do caractere "menos" como uma opção de comando pela função do analisador.

    
por 04.04.2018 / 13:29
-3

Se você quiser renomear o arquivo, -.bar , (mv não funcionará), tente isto:

cat >foo.bar <-.bar

antes de usar o comando:

rm -- -.bar

Você deve ser capaz de examinar o conteúdo do arquivo original em foo.bar

    
por 25.12.2011 / 22:38