Quale comando devo usare per rimuovere un file chiamato `-rf`?


67

Ho fatto qualcosa di folle a un certo punto che ha creato un file chiamato -rfsul mio filesystem.
Ora non riesco a capire come eliminarlo ...

Ho provato:

rm "-rf"
rm \-rf

Questi escono immediatamente, arrgh!

Qualcuno sa come rimuovere questo file? Preferibilmente senza ripulire accidentalmente tutta la mia cartella.


33
Alcuni nervi provano ad rmun file chiamato -rfdal tuo sistema senza ricordare l'esatta sintassi!
ChristopheD,

3
Per spiegare perché quelli non funzionano: le virgolette e l'escaping vengono analizzate dalla shell (in genere bash), quindi il risultato dell'analisi viene passato a rm(in esso argce argv) Quindi, entrambi risultano in array a cui ["rm", "-rf"]viene passato rm, che fa quello che ti aspetteresti.
Thanatos,

3
Penso che questo sia più vicino a un duplicato di questo da Unix e Linux StackExchange: unix.stackexchange.com/questions/1519/…
frabjous

12
Un vecchio bavaglio è quello di ottenere un file nominato *in una cartella. Includi anche un nome -rfe guarda il divertimento ;-)
RBerteig

@RBerteig: mkdir './-rf '(ls --classify, un valore predefinito comune in un alias di shell, aggiungerà a /)

Risposte:


127
unlink -rf

O

rm -- -rf

47
Questa è la soluzione più utile per imparare l'IMO, perché '-' per interrompere l'elaborazione degli argomenti è standardizzato attraverso gli strumenti GNU
Nathan O'Sullivan,

1
Per essere più precisi, tutto ciò che usa GNUgetopt ha --, il che dovrebbe significare la maggior parte dei moderni strumenti linux.
Geoffrey Zheng,

60

Un'altra opzione:

rm ./-rf

... supponendo che la directory corrente sia quella in cui risiede il file.


34

In alternativa puoi sempre modificare la directory in cui si trova e rimuovere il file in quel modo.

vim .

e quindi basta eliminare la riga con il file (usando D, dd non funzionerà).


5
bel trucco! [Diversi personaggi inutili]
Sergio Acosta,

Non pensavo che questo meritasse i voti negativi che aveva quando ho visto questa risposta per la prima volta questo pomeriggio, ma non ho avuto la possibilità di andare a verificare che vimavesse una modalità diretta. Chiaramente, la modifica della directory stessa stessa in un editor di testo non è né consigliata, né possibile senza un vero salto del telaio da parte di esperti. Si noti che emacsfunzionerebbe anche per lo stesso motivo.
RBerteig,

1
Punti extra per un uso intelligente di Vim! :)
Pierre-Antoine LaFayette,

bello da sapere;)
schöppi,

25

Una tecnica generica per l'eliminazione di nomi di file strani deve essere utilizzata.

 ls -li

per trovare il numero di inode del file e quindi utilizzare.

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

Non c'è bisogno di ricordare tutti i casi speciali.


4
Non sapevo che findavesse il potere di cancellare i file.
zneak,

Questo è ottimo anche per catturare file con nomi sconosciuti (a partire da o includendo caratteri backspace o con spazi bianchi extra alla fine), a condizione che tu abbia accesso a una GNU decente sulla tua scatola.
Olfan,

17

Anche se conosco il trucco "rm - -filename", generalmente quando in qualche modo ottengo un file con un vantaggio - nel suo nome che voglio rimuovere avvio un file manager della GUI e lo faccio da lì, per eliminare la possibilità di errori.


1
Potrebbe non avere affatto una GUI, quindi potrebbe non funzionare.
Wuffers,

12
Se fosse stupido e sbagliato, forse merita un downvote, ma non credo nel ridimensionare questa risposta solo perché "potrebbe non funzionare". Nessun suggerimento può venire da questo suggerimento.
JT.WK,

4
C'è sempre comandante di mezzanotte (o altri file manager basati su maledizioni) per quelli senza X.
thomasrutter,

9

Se vuoi solo essere sicuro:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf

4

Nel caso in cui ti trovi in ​​un Unix non GNU in cui ti senti tirato indietro all'età della pietra (nessuna --sintassi, nessun -inuminterruttore per trovare, nessun comando di collegamento, il tuo editor rifiuta di modificare le directory ecc. Ecc.) Puoi ancora aiutarti:

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

Ciò farà sì che vengano forniti tutti i potenziali candidati a rm che a loro volta chiederanno il permesso / rifiuto per ogni singolo file che viene alimentato.

Nel caso in cui il tuo rmnon supporti nemmeno lo -iswitch (HP-UX 10.2 su PA-RISC 1.1 qualcuno?), Fai solo attenzione:

find . -name '-rf' -print
# check that find's output is exactly and only what you need to delete
find . -name '-rf' -print | xargs rm

cosa succede se il tuo sistema non ha nemmeno find?
Lie Ryan,

Sarebbe davvero un male. Purtroppo, devo ancora incontrare un'installazione Unix senza una. Puoi darmi un puntatore?
Olfan,

Ripensandoci, la mia risposta sarebbe stata più appropriata se la domanda posta su serverfault. I super utenti non sono abbastanza probabili avere macchine antiche come quelle a cui mi riferisco. E quelli che lo faranno avranno imparato ad aiutare se stessi. ;-)
Olfan,

+1, @Olfan, in tua difesa, qualcuno che sta incontrando un unix legacy in un armadio da qualche parte ha ancora bisogno di una risorsa per imparare trucchi e suggerimenti da ...
RBerteig,

3

Supportando la risposta di jleedev , migliorerei con:

rm -i -- -rf

essere in modalità interattiva e chiedere conferma, in modo da poter essere veramente sicuri di ciò che si elimina. (anche se la soluzione va bene. È semplicemente per la tua tranquillità)

In realtà, usa anche quello:

\rm -i -- -rf

per essere sicuro di non utilizzare alias.


2

Come è già stato suggerito, ho sempre usato la sintassi

rm -rf -- filename

quando dovevo rimuovere un file con un trattino come prefisso perché - dice al comando che non cerca nessun altro parametro ma solo nomi di file.

Tenendolo a mente, al fine di proteggere la mia importante cartella dalla cancellazione accidentale dei file, sono stato utilizzato per creare un file vuoto chiamato semplicemente -i che normalmente viene messo in cima all'elenco dei file quando si risolve la * ricerca. Quindi il comando

rm -rf *

quando viene scagliato sulla mia cartella protetta viene esploso, durante l'esecuzione, nel comando:

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

e la shell, invece di eliminare tutto immediatamente, smette di chiedere una conferma (come richiede l'opzione -i).


+1 per il -inome del file hack - "I" era scettico, ma si mette alla prova!
Rymo

2

L'ultima volta che ho avuto questo problema, l'ho risolto con:

pitone

import os

os.remove ( "- rf")


1

Martin Clayton ha ragione.

È molto semplice e logico. Se esistono delle opzioni è sempre -XXXo --CCCCcosì se si mette un ./o il percorso completo -rfnon può essere considerato come una scelta e sarà considerato come una stringa normale.

Funziona con "tutti" nomi di file strani.

#pwd
/ Tmp / TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#

1

rm - -rf accetta la maggior parte degli strumenti gnu - come indicatore della fine delle opzioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.