Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I did something crazy at some point that created a file called -rf on my filesystem.
Now I can't figure out how to delete it...

I've tried:

rm "-rf"
rm \-rf

These just exit immediately, arrgh!

Anyone know how to remove this file? Preferably without accidentally cleaning out my whole folder.

share|improve this question

migrated from stackoverflow.com Oct 5 '10 at 22:09

This question came from our site for professional and enthusiast programmers.

31  
Some nerve trying to rm a file called -rf from your system without remembering the exact syntax! –  ChristopheD Oct 5 '10 at 22:08
3  
To explain why those don't work: Quotes and escaping are parsed by your shell (typically bash), and then the result of the parsing is passed to rm (in it's argc and argv) Thus, both of those result in the array ["rm", "-rf"] being passed to rm, which does what you would expect. –  Thanatos Oct 5 '10 at 22:10
3  
I think this is closer to a duplicate of this one from Unix and Linux stackexchange: unix.stackexchange.com/questions/1519/… –  frabjous Oct 5 '10 at 22:30
11  
An old gag is to get a file named * into a folder. Include one named -rf as well and watch the fun ;-) –  RBerteig Oct 6 '10 at 0:35
    
@RBerteig: mkdir './-rf ' (ls --classify, a common default in a shell alias, will append a /) –  Roger Pate Oct 6 '10 at 2:53

12 Answers 12

up vote 120 down vote accepted
unlink -rf

Or

rm -- -rf
share|improve this answer
44  
This is the most useful solution to learn IMO, because '--' to stop processing arguments is standardised across the GNU tools –  Nathan O'Sullivan Oct 6 '10 at 7:43
1  
To be more precise, anything using GNU getopt has --, which should mean most modern linux tools. –  Geoffrey Zheng Oct 6 '10 at 17:28

Another option:

rm ./-rf

... asuming your current directory is the one where the file resides.

share|improve this answer
    
+1 that's my way too :) –  Peter G. Oct 6 '10 at 21:16

Even though I know about the "rm -- -filename" trick, generally when I somehow get a file with a leading - in its name that I want to remove I start a GUI file manager and do it from there, to eliminate the chance of mistakes.

share|improve this answer
1  
He may not have a GUI at all, so this might not work. –  Wuffers Oct 5 '10 at 22:25
12  
If it was stupid and wrong maybe it deserves a downvote, but I don't believe in downvoting this answer just because it 'might not work'. No harm can come of this suggestion. –  JT.WK Oct 5 '10 at 22:43
4  
There's always midnight commander (or other curses-based file managers) for those without X. –  thomasrutter Oct 7 '10 at 2:39

Alternatively you can always edit the directory its in and remove the file that way.

vim .

and then just delete the line with the file on it (using D, dd won't work).

share|improve this answer
5  
nice trick! [Several useless chars] –  Sergio Acosta Oct 6 '10 at 4:48
    
I didn't think this deserved the downvotes it had when I first saw this answer this afternoon, but I didn't have a chance to go verify that vim had a dired mode. Clearly, editing the actual directory itself in a text editor is neither recommended, nor possible without real expert hoop jumping. Note that emacs would work too, and for the same reason. –  RBerteig Oct 6 '10 at 8:38
1  
Extra points for clever Vim use! :) –  Pierre-Antoine LaFayette Oct 6 '10 at 10:55
    
nice to know ;) –  schöppi Oct 21 '10 at 21:21

A generic technique for deleting weird filenames is to use.

 ls -li

to find the inode number of file and then use.

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

No need to remember all the special cases.

share|improve this answer
4  
Didn't know find had the power to delete files. –  zneak Oct 6 '10 at 2:05
    
This is also great for catching files with unknown names (starting with or including backspace characters or having extra whitespace at the end), provided you have access to a decent GNU find on your box. –  Olfan Oct 6 '10 at 10:20

If you just want to be sure:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
share|improve this answer

martin clayton is right.

It is very simple and logical. If the options exist it is always -XXX or --CCCC so if you put a ./ or the full path -rf cannot be considered as an option and will be considered as a normal string.

It works with "all" strange file names.

#pwd
/tmp/TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#
share|improve this answer

As it has already been suggested I've always used the syntax

rm -rf -- filename

when I had to remove a file with a dash as prefix because the -- says to the command that it does not search for any other parameter but just file names.

Keeping it in mind, in order to protect my important folder by accidental file deletion I was used to create an empty file called simply -i which is normally put at the top of the file list when resolving the * search. So the command

rm -rf *

when excuted on my protected folder is exploded, dureing execution, in the command:

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

and the shell, instead of deleting everything immediately, stops asking for a confirmation (as the -i option requires).

share|improve this answer
    
+1 for the -i filename hack - "I" was skeptical, but it tests out! –  rymo Nov 1 '10 at 21:33

rm -- -rf most gnu tools accept -- as marker of end of options

share|improve this answer

Just in case you are on some non-GNU Unix where you feel yourself yanked back to the stone age (no -- syntax, no -inum switch to find, no unlink command, your editor refuses editing directories etc. etc.) you can still help yourself:

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

This will cause find to feed all potential candidates to rm which in turn will ask for permission/denial for every single file it is fed.

In case your rm doesn't even support the -i switch (HP-UX 10.2 on PA-RISC 1.1 anyone?), just be more careful:

find . -name '-rf' -print
# check that find's output is exactly and only what you need to delete
find . -name '-rf' -print | xargs rm
share|improve this answer
    
what if your system doesn't even have find? –  Lie Ryan Oct 6 '10 at 11:32
    
That would be evil indeed. Alas, I have yet to meet a Unix installation without one. Can you give me a pointer? –  Olfan Oct 6 '10 at 13:44
    
Giving it some thought, my answer would have been more appropriate were the question asked on serverfault. Super Users are not quite probable to have machinery around as ancient as the ones I'm referring to. And those who do will have learned to help themselves. ;-) –  Olfan Oct 6 '10 at 13:49
    
+1, @Olfan, in you defense, someone just now encountering a legacy unix in a closet somewhere still needs a resource to learn tips and tricks from... –  RBerteig Oct 6 '10 at 20:51
    
+1 for covering edge cases –  Agos Oct 7 '10 at 15:56

Supporting jleedev's answer, I'd improve with:

rm -i -- -rf

to be in interactive mode and ask for confirmation, so you can really be sure of what you delete. (though the solution is fine. it's simply for your peace of mind)

Actually, even use that:

\rm -i -- -rf

to be sure that you're not using any aliases.

share|improve this answer

Last time I had this problem, I solved it with:

python

import os

os.remove("-rf")

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.