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.