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.

djsmiley2kStaysInside
  • 6,643
  • 2
  • 31
  • 43
Pierre-Antoine LaFayette
  • 1,097
  • 1
  • 10
  • 16
  • 34
    Some nerve trying to `rm` a file called `-rf` from your system without remembering the exact syntax! – ChristopheD Oct 05 '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 05 '10 at 22:10
  • 3
    I think this is closer to a duplicate of this one from Unix and Linux stackexchange: http://unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-begins-with – frabjous Oct 05 '10 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 06 '10 at 00:35
  • @RBerteig: `mkdir './-rf '` (ls --classify, a common default in a shell alias, will append a /) –  Oct 06 '10 at 02:53
  • @Roger, I like that one. `--classify` didn't exist as an option for `ls` when I last used a Unix box on a regular basis (ca. late 80's). But now that it does, that is just perfect. I nearly got burned by a file named `*.*` in a folder on VMS (on a VAX 11/780, IIRC) when I was just starting out... and I know it was a common prank on PDP-10 and PDP-11 systems too. – RBerteig Oct 06 '10 at 08:34

12 Answers12

128
unlink -rf

Or

rm -- -rf
Josh Lee
  • 1,623
  • 2
  • 14
  • 19
  • 49
    This is the most useful solution to learn IMO, because '--' to stop processing arguments is standardised across the GNU tools – Nathan O'Sullivan Oct 06 '10 at 07:43
  • 1
    To be more precise, anything using [GNU `getopt`](http://www.gnu.org/s/libc/manual/html_node/Using-Getopt.html#Using-Getopt) has `--`, which should mean most modern linux tools. – Geoffrey Zheng Oct 06 '10 at 17:28
61

Another option:

rm ./-rf

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

martin clayton
  • 1,122
  • 8
  • 9
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).

oadams
  • 431
  • 3
  • 7
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.

user51427
  • 349
  • 2
  • 3
  • 4
    Didn't know `find` had the power to delete files. – zneak Oct 06 '10 at 02: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 06 '10 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.

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

If you just want to be sure:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
Jan
  • 241
  • 1
  • 3
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
Olfan
  • 449
  • 4
  • 10
  • what if your system doesn't even have `find`? – Lie Ryan Oct 06 '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 06 '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 06 '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 06 '10 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.

haylem
  • 124
  • 1
  • 6
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).

Ghidello
  • 121
  • 2
2

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

python

import os

os.remove("-rf")

Jono
  • 21
  • 1
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
#
RBerteig
  • 3,305
  • 23
  • 22
Louis
  • 2,574
  • 3
  • 17
  • 14
1

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

Konrads
  • 145
  • 1
  • 6
  • 18