如何使用以连字符“-”开头的文件名作为命令参数?


20

这可能是一个简单的问题,但是如何在命令行程序中使用以“-”开头的文件?

例如,我试图pdfgrep在一个名为的文件上使用,-2013-01-01.pdf但是它抱怨没有为2、0、1、3等定义选项。

将文件名更改为不以“-”开头的文件名即可解决该问题,但这不是一个选择,因为文件不是我创建的。我只想检查我知道即将发生的特定更改。


这不起作用,给了我与以前相同的错误
Kristoffer

3
例如,grep -i dfv -- -myfile1 -myfile2

这样可行!谢谢!让它成为答案,我可以将其标记为为后代所接受:)
Kristoffer

@AliNa,使用引号特别适合pdfgrep吗?它对我不起作用。我正在使用Lubuntu。

4
@AliNa:引号不起作用,因为它们是由外壳程序而不是程序解释的。
hammar 2013年

Answers:


22

--命令行上经常使用它来向程序发送信号,告知不再使用更多可用的命令开关。如果文件包含破折号,程序将尝试将该破折号解释为一个选项,这尤其有用。

  1. 如果没有--,则会产生错误:

    $ 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. 使用,--我们有一个成功的命令:

    $ 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被编程为理解--为意味着以下命令行参数不是选项。大多数程序都执行相同的操作,但并非所有程序都可以理解--。对于没有的程序,解决方案是在文件名前加上./,如下所示:

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

    这适用于任何命令,除非出于某种原因该命令不能接受路径,只能接受纯文件名。

有关命令行的一般介绍,请参见此有用的PDF


4
不幸的是,--不适用于所有命令行程序。我从OP的评论中认为那pdfgrep是其中之一,它是无法识别的--。但是这里的接受却暗示了另外的情况。无论如何,必须对程序进行编码以识别--。许多程序使用库来解析其参数,而后者确实会识别--。但是有些没有,其中有些没有编码为识别--
Eliah Kagan

3
对于那些无法识别--通常解决方法的程序,请将其放在./文件的前面:pdfgrep ./-2013-01-01.pdf
CarlosCampderrós2013年

2
是的,放在./最前面是最可移植,最强大的解决方案。适用于任何程序,任何Unix版本。
hlovdal

16

您在文件名前添加./(或其他有效的相对或绝对路径)。这样,它是便携式的。

例:

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

--并非总是可以使用来指示选项的结束。有些命令会知道,有些则不会。这将在不同的系统之间发生变化。所以最后,它的便携性较差。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.