Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

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.

share|improve this question
1  
You need to use -- in front of the options, so the -2013 files are not interpreted by the program as available switches. –  user76204 Apr 4 '13 at 23:36
    
this dos not work, gives me the same errors as before –  Kristoffer Apr 4 '13 at 23:41
2  
As an example, grep -i dfv -- -myfile1 -myfile2. –  user76204 Apr 4 '13 at 23:42
1  
Simply use quotation marks "-2013-01-01.pdf". –  AliNa Apr 5 '13 at 0:20
3  
@AliNa: Quotation marks won't work, as they are interpreted by the shell, not the program. –  hammar Apr 5 '13 at 4:08
show 3 more comments

2 Answers

up vote 19 down vote accepted

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.

share|improve this answer
4  
Unfortunately, -- does not work with all command-line programs. I had assumed from that comment by the OP that pdfgrep is one of them that doesn't recognize --. But the accept here suggests otherwise. In any case, a program must be coded to recognize --. Many programs use libraries to parse their arguments, which do recognize --. But some don't, and of those, some are not coded to recognize --. –  Eliah Kagan Apr 5 '13 at 0:10
2  
For those programs that do not recognise -- the usual workaround is putting ./ in front of the file: pdfgrep ./-2013-01-01.pdf –  Carlos Campderrós Apr 5 '13 at 6:51
1  
Yes, putting ./ in front is the most portable and robust solution. Works on any program, on any unix version. –  hlovdal Apr 5 '13 at 7:38
add comment

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.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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