68

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.

6
  • 34
    Some nerve trying to rm a file called -rf from your system without remembering the exact syntax! Oct 5, 2010 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, 2010 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, 2010 at 22:30
  • 12
    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, 2010 at 0:35
  • @RBerteig: mkdir './-rf ' (ls --classify, a common default in a shell alias, will append a /)
    – Roger Pate
    Oct 6, 2010 at 2:53

12 Answers 12

128
unlink -rf

Or

rm -- -rf
2
  • 49
    This is the most useful solution to learn IMO, because '--' to stop processing arguments is standardised across the GNU tools Oct 6, 2010 at 7:43
  • 1
    To be more precise, anything using GNU getopt has --, which should mean most modern linux tools. Oct 6, 2010 at 17:28
61

Another option:

rm ./-rf

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

0
34

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).

4
  • 5
    nice trick! [Several useless chars] Oct 6, 2010 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, 2010 at 8:38
  • 1
    Extra points for clever Vim use! :) Oct 6, 2010 at 10:55
  • nice to know ;)
    – dns13
    Oct 21, 2010 at 21:21
25

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.

2
  • 4
    Didn't know find had the power to delete files.
    – zneak
    Oct 6, 2010 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, 2010 at 10:20
17

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.

3
  • 1
    He may not have a GUI at all, so this might not work.
    – Wuffers
    Oct 5, 2010 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, 2010 at 22:43
  • 4
    There's always midnight commander (or other curses-based file managers) for those without X. Oct 7, 2010 at 2:39
9

If you just want to be sure:

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

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
4
  • what if your system doesn't even have find?
    – Lie Ryan
    Oct 6, 2010 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, 2010 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, 2010 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, 2010 at 20:51
3

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.

2

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).

1
  • +1 for the -i filename hack - "I" was skeptical, but it tests out!
    – rymo
    Nov 1, 2010 at 21:33
2

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

python

import os

os.remove("-rf")

1

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
#
1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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