Linux / UNIX : Move File Starting With A Dash

last updated in Categories , ,

In Unix or Linux operating systems, how do I move file(s) starting with a dash (e.g., /home/you/--filename.txt or /home/you/-filename.txt)? How do I copy a file whose name begins with dash/hyphen (“-“)?

Many meta-characters such as semicolons, spaces, backslashes, dollar signs, question marks, and asterisks are characters that are interpreted under Linux and Unix-like operating systems as shell commands.
For example, - or -- (dash or hyphen) interpreted as an option passed to the command. Try the following suggestions for moving (mv) or copying (cp) these files.

Move File Starting With A Dash

The syntax is as follows:

cp -- source dest
cp [option] -- source dest

We use “--” to make Linux and Unix command stop parsing shell command line options. Now, let us see some examples.

Create a test file

Type the following command:

cd /tmp/
> '-foo.txt'
> '--bar.txt'

List files starting with a dash

Try to list them, enter:

ls -l *.txt

You will get an error as follows:

ls: unrecognized option '--bar.txt'
Try `ls --help' for more information.

To delimit the option list use -- i.e. type the following ls command:

ls -l -- *.txt

The cp and mv commands

When a file whose name begins with - or --, copy or move files using the following syntax:

cp -- '--bar.txt' /path/to/dest
cp -- '-test.doc' /home/vivek/backups/test.doc

OR

cp -v -- '--bar.txt' /path/to/dest

To move files:

mv -- '--bar.txt' /path/to/dest

OR

mv -v -- '--bar.txt' /path/to/dest

Linux Move File Starting With A Dash

Unix and Linux copy file starting with a dash

The - or -- considered as part of command line options. Therefore, you can not copy, list, delete or move any files starting with those characters. In short, the syntax is as follows:

cp options -- '--filename' /dest
mv options -- '--filename' /dest

The -- delimit the option list. Later arguments, if any, are treated a operands even if they begin with - or —. This applies to all Linux/Unix/macOS/*BSD commands such as rm, cp, mv, ls, ln and so on:

 command -- 'file'
command [options] -- 'file'
rm -- '--filename'
rm -fr -- '-dirname'
rmdir -- '--dirname'

How to use find command for same purpose

The syntax is:
find /dir/to/search -maxdepth 1 -name '--filename' -delete
See GNU find man page here.

Tip: Handling a filename starting with a dash (-)

You can “hide” the dash from the command by starting the filename with ./ (dot slash). For example, try to remove a file named “-filename.txt” using rm command:

> '-filename'
rm -filename # will get an error #
rm ./-filename

How to delete a file whose name begins with hyphen dash or minus

Conclusion

This page explained how to handle a Linux or Unix filename starting with a dash (-). The trick is to either start the filename with ./ or pass the -- before filename.

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Notable Replies

  1. mv -- -fileNameStartingWithADash newName
    see info coreutils 'Common options'

Continue the discussion www.nixcraft.com

Participants

Historical Comment Archive

15 comment

  1. @Vivek – You are right, Zdenek, [touch] code is wrong in Bash, without [–] end-of-option marker, you cannot use

    touch '--DoubleDashName'
    touch '-OneDashName'

    or you could alternatively use [current directory prefix]:
    reading manual [man rm] gives you two tips : second one is using [./] prefix.

    touch ./-YouCantRemoveMeSimply
    rm ./-YouCantRemoveMeSimply

  2. What about files that start with a tilde ‘~’? In particular say someone has happily created a single file called ‘~’ and you have to delete it?

  3. @Vivek regarding CurrentDirectoryPrefix
    Why don’t you add this tip ( ./ ) , like for many other topics where you give more than one way to do it (You usually seem to have the “There Is More Than One Way To Do It (TIMTOWTDI)” spirit ! :-) )

    @Vivek regarding inode, you may have a little more than that to say, don’t you ? (explain find )

    Anyway, this topic is a subtopic of the general need to deal with a file which name is difficult to handle, do you feel like creating it someday? (not only dash, but star, etc)?

  4. I had issue trying to delete a file named ‘-d’, but for some odd reasons, the above suggestions didn’t work for me, giving me the No such file or directory. What I then tried was using the vim command on the directory the file is on (bringing up vim’s file navigation) and was able to visually select the file and delete it that way.

  5. Yeah. LOL. Well, this is simply a bug that will never get fixed, because we know about it. The command reads the output as part of the command PROBLEM SOLVED NEXT PROBLEM PLEASE

    Still, have a question? Get help on our forum!