20

This may be a simple question, but how do I use files starting with "-" with command line programs?

For example, I am trying to use pdfgrep on a file named -2013-01-01.pdf but it complains that there are no options defined for 2, 0, 1, 3 and so on.

Changing the filename to something that does not start with "-" solves it, but this is not an option since the files aren't created by me. I simply want to check for a specific change I know is coming.

muru
  • 207,228

2 Answers2

22

Very frequently -- is used on the command-line to signal to a program that no more available command switches are going to be used. This is particularly useful if a file contains a dash, which the program would try to interpret as an option.

  1. Without the --, there is an error generated:

    $ pdfgrep -i posix -find.pdf -xorg.pdf
    
    pdfgrep: invalid option -- 'f'
    pdfgrep: invalid option -- 'd'
    pdfgrep: invalid option -- '.'
    pdfgrep: invalid option -- 'p'
    pdfgrep: invalid option -- 'd'
    pdfgrep: invalid option -- 'f'
    
  2. With the -- used we have a successful command:

    $ pdfgrep -i posix -- -find.pdf -xorg.pdf
    
    -find.pdf: on the command line. Currently-implemented types are emacs (this is the default), posix-awk,
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    
  3. pdfgrep is programmed to understand -- to mean that the following command-line arguments are not options. Most programs do the same, but not all programs understand --. For programs that don't, the solution is to prepend the filename with ./, like this:

     pdfgrep -i posix ./-find.pdf ./-xorg.pdf
    

    This should work with any command, unless for some reason the command cannot accept a path, only a pure filename.

For a general introduction to the command-line, see this useful PDF.

Flimm
  • 44,031
16

You prepend the file name with ./ (or another relative or absolute path that works). This way it's portable.

Example:

for zefile in ./*.tmp
do
   rm -f "$zefile"
done

The use of -- to indicate the end of options is not always available. Some commands will know it, some won't. And this will change across different systems. So in the end, it's less portable.

dessert
  • 40,956