Unix tools: what if a file is named minus something?
I'm always wondering: most GNU/Unix tools take options in the form "minus something", sometimes followed by an argument. What if you got a file named minus something?
$ ls
-f
$ rm -f
$ ls
-f
$ mv -f abc
mv: missing destination file operand after `abc'
Try `mv --help' for more information.
$ cat -f
cat: invalid option -- 'f'
Try `cat --help' for more information.
or
$ ls
-ohello.c
$ gcc -ohello -ohello.c
gcc: fatal error: no input files
compilation terminated.
This is just out of curiosity; I don't have a use case for this.
To remove a file named -x
, use rm -- -x
(--
means end of options) or rm ./-x
.
It is fairly common to ask this type of question in interview settings. A common way to handle files with dashes is either:
$ rm -- -f
$ rm ./-f
A common question in Unix. The main way is to give the full path name to the file, so it doesn't have a dash in front of it:
$ rm -file.txt
unknown option -l
$ rm ./-file.txt #No problem!
$ rm $PWD/-file.txt #Same thing
Some commands, you can use a dash by itself (or a double dash) to end the options. However, this is not necessarily true with all commands, or even the same command on different systems.
$ rm -- -file.txt #Works on Linux but not on some Unix systems
you have to use
rm -- <filename>
Ex:
rm -- -f