Qual comando eu preciso usar para remover um arquivo chamado `-rf`?

67

Eu fiz algo louco em algum momento que criou um arquivo chamado -rfno meu sistema de arquivos.
Agora não consigo descobrir como excluí-lo ...

Eu tentei:

rm "-rf"
rm \-rf

Estes simplesmente saem imediatamente, arrgh!

Alguém sabe como remover este arquivo? De preferência, sem limpar acidentalmente toda a minha pasta.

Pierre-Antoine LaFayette
fonte
33
Algum nervo ao tentar rmchamar um arquivo -rfdo seu sistema sem lembrar a sintaxe exata!
ChristopheD
3
Para explicar por que eles não funcionam: aspas e escape são analisados ​​por seu shell (normalmente bash) e, em seguida, o resultado da análise é passado para rm(em it argce argv). Assim, os dois resultam na matriz que ["rm", "-rf"]é passada para rm, o que faz o que você esperaria.
Thanatos
3
Eu acho que isso está mais próximo de uma duplicata deste do Unix e Linux stackexchange
frabjous
12
Um problema antigo é obter um arquivo nomeado *em uma pasta. Incluir um chamado -rfbem e assistir a diversão ;-)
RBerteig
@RBerteig: mkdir './-rf '(ls --classify, um padrão comum em um alias de shell, irá acrescentar a /)

Respostas:

127
unlink -rf

Ou

rm -- -rf
Josh Lee
fonte
47
Esta é a solução mais útil para aprender IMO, porque '-' para parar o processamento de argumentos é padronizado nas ferramentas GNU
Nathan O'Sullivan
11
Para ser mais preciso, qualquer coisa usando o GNUgetopt possui --, o que deve significar a maioria das ferramentas Linux modernas.
Geoffrey Zheng
60

Outra opção:

rm ./-rf

... assumindo o diretório atual é onde o arquivo reside.

Martin Clayton
fonte
34

Como alternativa, você sempre pode editar o diretório e remover o arquivo dessa maneira.

vim .

e exclua a linha com o arquivo (usando D, dd não funcionará).

oadams
fonte
5
belo truque! [Vários caracteres inúteis] #
Sergio Acosta
Não achei que isso merecesse os votos negativos quando vi esta resposta pela tarde, mas não tive a chance de verificar se vimhavia um modo direcionado. Claramente, editar o próprio diretório real em um editor de texto não é recomendado nem possível sem um verdadeiro salto de arco especializado. Observe que emacstambém funcionaria, e pelo mesmo motivo.
RBerteig 6/10/10
11
Pontos extras pelo uso inteligente do Vim! :)
Pierre-Antoine LaFayette
bom saber;)
schöppi
25

Uma técnica genérica para excluir nomes de arquivos estranhos é usar.

 ls -li

para encontrar o número de inode do arquivo e, em seguida, use.

find ./ -inum <number of file> -delete

Não há necessidade de lembrar de todos os casos especiais.

user51427
fonte
4
Não sabia que findtinha o poder de excluir arquivos.
Zneak 6/10/10
Isso também é ótimo para capturar arquivos com nomes desconhecidos (começando com ou incluindo caracteres de backspace ou com espaço em branco extra no final), desde que você tenha acesso a uma localização decente do GNU em sua caixa.
Olfan # 06/10
17

Embora eu conheça o truque "rm - -filename", geralmente quando, de alguma forma, recebo um arquivo com um líder - em seu nome que quero remover, inicio um gerenciador de arquivos da GUI e faço a partir daí, para eliminar a chance de erros.

Heptite
fonte
11
Ele pode não ter uma GUI, portanto, isso pode não funcionar.
Wuffers 5/10/10
12
Se foi estúpido e errado, talvez mereça voto negativo, mas não acredito em votar esta resposta apenas porque "pode ​​não funcionar". Nenhum dano pode advir dessa sugestão.
JT.WK
4
Há sempre o comandante da meia-noite (ou outros gerenciadores de arquivos baseado em curses) para aqueles sem X.
thomasrutter
9

Se você só quer ter certeza:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
Jan
fonte
4

Caso você esteja em algum Unix que não seja o GNU onde você se sinta puxado de volta à idade da pedra (sem --sintaxe, sem -inumopção de encontrar, sem comando de desconexão, seu editor se recusará a editar diretórios etc.), você ainda poderá ajudar:

find . -name '-rf' -print | xargs rm -i

Isso fará com que o find alimente todos os candidatos em potencial à rm, que, por sua vez, solicitarão permissão / negação para cada arquivo alimentado.

Caso você rmnem suporte o -iswitch (HP-UX 10.2 no PA-RISC 1.1, alguém?), Tenha mais cuidado:

find . -name '-rf' -print
# check that find's output is exactly and only what you need to delete
find . -name '-rf' -print | xargs rm
Olfan
fonte
e se o seu sistema nem sequer tiver find?
Lie Ryan
Isso seria realmente ruim. Infelizmente, ainda tenho que encontrar uma instalação Unix sem uma. Você pode me dar um ponteiro?
Olfan
Pensando bem, minha resposta teria sido mais apropriada se a pergunta fosse feita no serverfault. Não é provável que os superusuários tenham máquinas tão antigas quanto as que estou me referindo. E aqueles que o fazem aprenderão a ajudar a si mesmos. ;-)
Olfan 6/10/10
+1, @Olfan, em você defesa, alguém só agora encontrando um legado unix em um armário em algum lugar ainda precisa de um recurso para aprender dicas e truques de ...
RBerteig
3

Apoiando a resposta de jleedev , eu melhoraria com:

rm -i -- -rf

para estar no modo interativo e pedir confirmação, para ter certeza do que você excluiu. (embora a solução seja boa. é simplesmente para sua paz de espírito)

Na verdade, até use isso:

\rm -i -- -rf

para ter certeza de que você não está usando aliases.

haylem
fonte
2

Como já foi sugerido, eu sempre usei a sintaxe

rm -rf -- filename

quando tive que remover um arquivo com um traço como prefixo, porque o - diz ao comando que ele não procura nenhum outro parâmetro, mas apenas nomes de arquivos.

Mantendo isso em mente, para proteger minha importante pasta por exclusão acidental de arquivos, fui usado para criar um arquivo vazio chamado simplesmente -i, que normalmente é colocado no topo da lista de arquivos ao resolver a pesquisa *. Então o comando

rm -rf *

quando excutado em minha pasta protegida é explodido, durante a execução, no comando:

rm -rf -i filename1 filename2 .... (all the other files in the folder)

e o shell, em vez de excluir tudo imediatamente, para de pedir uma confirmação (conforme a opção -i exige).

Ghidello
fonte
+1 para o -inome do arquivo hack - "I" era cético, mas testou!
Rymo
2

A última vez que tive esse problema, resolvi-o com:

Pitão

importação os

os.remove ("- rf")

Jono
fonte
1

Martin Clayton está certo.

É muito simples e lógico. Se as opções existirem, é sempre -XXXou --CCCCnão, se você colocar um ./ou o caminho completo -rfnão poderá ser considerado uma opção e será considerado como uma sequência normal.

Funciona com "todos" nomes de arquivos estranhos.

#pwd
/ tmp / TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#
Louis
fonte
1

rm - -rf a maioria das ferramentas gnu aceita - como marcador do fim das opções

Konrads
fonte