如何使用以破折号“-”开头的文件名作为命令参数?

Kri*_*fer 20 command-line special-characters filename

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

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

将文件名更改为不以“-”开头的内容可以解决它,但这不是一个选项,因为这些文件不是由我创建的。我只是想检查一下我知道即将发生的特定变化。

小智 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'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用--used 我们有一个成功的命令:

    $ 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.
    
    Run Code Online (Sandbox Code Playgroud)
  3. pdfgrep被编程为理解--以下命令行参数不是选项。大多数程序都这样做,但并非所有程序都理解--. 对于没有的程序,解决方案是在文件名前加上./,如下所示:

     pdfgrep -i posix ./-find.pdf ./-xorg.pdf
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • 不幸的是,`--` **不适用于*所有*命令行程序。我从 [OP 的评论](http://askubuntu.com/questions/278000/how-to-use-commands-with-input-filename-starting-with-character/278003?noredirect=1# comment348923_278000)`pdfgrep` 是其中之一,它不能识别 `--`。但这里的接受暗示并非如此。无论如何,必须对程序进行编码以识别“--”。许多程序使用库来解析它们的参数,这些参数可以识别`--`。但是有些没有,其中一些没有编码以识别`--`。 (4认同)
  • 对于那些不识别 `--` 的程序,通常的解决方法是将 `./` 放在文件前面:`pdfgrep ./-2013-01-01.pdf` (3认同)
  • 是的,将 `./` 放在前面是最便携和最健壮的解决方案。适用于任何程序,任何 unix 版本。 (2认同)

Oli*_*lac 16

您在文件名前加上./(或另一个有效的相对或绝对路径)。这样它是便携式的。

例子:

for zefile in ./*.tmp
do
   rm -f "$zefile"
done
Run Code Online (Sandbox Code Playgroud)

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