Quelle commande dois-je utiliser pour supprimer un fichier appelé `-rf`?

67

J'ai fait quelque chose de fou à un moment donné qui a créé un fichier appelé -rfsur mon système de fichiers.
Maintenant, je ne sais pas comment le supprimer ...

J'ai essayé:

rm "-rf"
rm \-rf

Ceux-ci viennent de sortir immédiatement, arrgh!

Quelqu'un sait comment supprimer ce fichier? De préférence sans nettoyer accidentellement tout mon dossier.

Pierre-Antoine LaFayette
la source
33
Certains nerfs d'essayer rmun fichier appelé à -rfpartir de votre système sans se rappeler la syntaxe exacte!
ChristopheD
3
Pour expliquer pourquoi ceux-ci ne fonctionnent pas: Les citations et les échappements sont analysés par votre shell (généralement bash), puis le résultat de l'analyse est passé à rm(en son argcet argv). Ainsi, ces deux résultats entraînent le passage du tableau ["rm", "-rf"]à rm, qui fait ce que vous attendez.
Thanatos
3
Je pense que cela ressemble plus à un duplicata de celui-ci de stackexchange sous Unix et Linux: unix.stackexchange.com/questions/1519/…
frabjous
12
Un vieux gag consiste à obtenir un fichier nommé *dans un dossier. Inclure un nommé -rfet regarder le plaisir ;-)
RBerteig
@RBerteig: mkdir './-rf '(ls --classify, un défaut commun dans un alias de shell, sera ajouté un /)

Réponses:

127
unlink -rf

Ou

rm -- -rf
Josh Lee
la source
47
C'est la solution la plus utile pour apprendre l'OMI, car '-' pour arrêter le traitement des arguments est normalisé dans les outils GNU
Nathan O'Sullivan
1
Pour être plus précis, tout ce qui utilise GNUgetopt a --, ce qui devrait signifier la plupart des outils linux modernes.
Geoffrey Zheng
60

Une autre option:

rm ./-rf

... asuming votre répertoire actuel est celui où réside le fichier.

Martin Clayton
la source
34

Sinon, vous pouvez toujours modifier le répertoire et le supprimer de cette façon.

vim .

puis supprimez simplement la ligne contenant le fichier (utiliser D, dd ne fonctionnera pas).

oadams
la source
5
Joli tour! [Plusieurs personnages inutiles]
Sergio Acosta
Je ne pensais pas que cela méritait les vimcritiques négatives de la première réponse de cet après-midi, mais je n’ai pas eu la chance de vérifier que le mode était en mode dégradé. Il est clair que l'édition du répertoire lui-même dans un éditeur de texte n'est ni recommandée, ni possible sans un véritable saut de cerceau expert. Notez que emacscela fonctionnerait aussi, et pour la même raison.
RBerteig
1
Des points supplémentaires pour une utilisation intelligente de Vim! :)
Pierre-Antoine LaFayette
bon à savoir;)
schöppi
25

Une technique générique pour supprimer les noms de fichiers étranges consiste à utiliser.

 ls -li

pour trouver le numéro d'inode du fichier, puis utiliser.

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

Pas besoin de se souvenir de tous les cas particuliers.

utilisateur51427
la source
4
Je ne savais pas findavoir le pouvoir de supprimer des fichiers.
zneak
Cela est également idéal pour attraper des fichiers avec des noms inconnus (commençant par des caractères de retour arrière ou comprenant des espaces ou des espaces supplémentaires à la fin), à condition que vous ayez accès à une découverte GNU décente sur votre boîte.
Olfan
17

Même si je connais l’astuce "rm - -filename", généralement lorsque j’obtiens en quelque sorte un fichier avec un nom principal - dans son nom que je veux supprimer, je lance un gestionnaire de fichiers GUI et le fais à partir de là, afin d’éliminer les risques des erreurs.

Heptite
la source
1
Il peut ne pas avoir d'interface graphique du tout, donc cela pourrait ne pas fonctionner.
Wuffers
12
Si c'était stupide et faux, peut-être mérite-t-il un vote négatif, mais je ne crois pas qu'il soit négatif de voter cette réponse simplement parce que cela «pourrait ne pas fonctionner». Aucun mal ne peut venir de cette suggestion.
JT.WK
4
Il y a toujours un commandant de minuit (ou d'autres gestionnaires de fichiers basés sur des
sorts
9

Si vous voulez juste être sûr:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
Jan
la source
4

Juste au cas où vous seriez sur un Unix non-GNU où vous vous sentez renvoyé à l'âge de pierre (pas de --syntaxe, pas de -inumcommutateur à trouver, pas de commande unsink, votre éditeur refuse de modifier des répertoires, etc.), vous pouvez toujours vous aider:

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

Cela entraînera find à nourrir tous les candidats potentiels à la requête de l'entreprise qui, à son tour, demandera une permission / un refus pour chaque fichier alimenté.

Si vous rmne supportez même pas le -icommutateur (HP-UX 10.2 sur n'importe qui de PA-RISC 1.1?), Soyez plus prudent:

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
la source
Et si votre système n'en avait même pas find?
Lie Ryan
Ce serait vraiment mauvais. Hélas, je n'ai pas encore rencontré d'installation Unix sans. Pouvez-vous me donner un pointeur?
Olfan
En y réfléchissant un peu, ma réponse aurait été plus appropriée si la question posée sur serverfault. Il est peu probable que les super-utilisateurs disposent de machines aussi anciennes que celles dont je parle. Et ceux qui le feront auront appris à s'aider eux-mêmes. ;-)
Olfan
+1, @ Olfan, votre défense, quelqu'un qui vient de rencontrer un héritage Unix dans un placard quelque part a encore besoin d'une ressource pour apprendre des trucs et astuces ...
RBerteig
3

Soutenant la réponse de jleedev , je m'améliorerais avec:

rm -i -- -rf

être en mode interactif et demander une confirmation pour être vraiment sûr de ce que vous supprimez. (Même si la solution est bonne. C'est simplement pour votre tranquillité d'esprit)

En fait, même utiliser cela:

\rm -i -- -rf

pour être sûr que vous n'utilisez aucun alias.

haylem
la source
2

Comme cela a déjà été suggéré, j'ai toujours utilisé la syntaxe

rm -rf -- filename

lorsque j'ai dû supprimer un fichier avec un tiret comme préfixe car - indique à la commande qu'elle ne recherche aucun autre paramètre, mais uniquement les noms de fichier.

Gardez cela à l'esprit, afin de protéger mon dossier important contre la suppression accidentelle de fichiers, j'étais habitué à créer un fichier vide appelé simplement -i qui est normalement placé en haut de la liste des fichiers lors de la résolution de la recherche *. Donc la commande

rm -rf *

lorsqu’il est excuté, mon dossier protégé est éclaté, en cours d’exécution, dans la commande:

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

et le shell, au lieu de tout supprimer immédiatement, cesse de demander une confirmation (comme le demande l'option -i).

Ghidello
la source
+1 pour le -ihack de nom de fichier - "I" était sceptique, mais il teste!
Rymo
2

La dernière fois que j'ai eu ce problème, je l'ai résolu avec:

python

importation os

os.remove ("- rf")

Jono
la source
1

Martin Clayton a raison.

C'est très simple et logique. Si les options existent , il est toujours -XXXou --CCCCsi vous mettez un ./ou le chemin complet -rfne peut pas être considéré comme une option et sera considérée comme une chaîne normale.

Cela fonctionne avec "tous" les noms de fichiers étranges.

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

rm - la plupart des outils GNU acceptent - comme marqueur de fin d'options

Konrads
la source