这可能是一个简单的问题,但是如何在命令行程序中使用以“-”开头的文件?
例如,我尝试pdfgrep
在名为的文件上使用-2013-01-01.pdf
,但它抱怨说没有为 2、0、1、3 等定义选项。
将文件名改为不以“-”开头的文件名即可解决问题,但这不是一个选项,因为这些文件不是我创建的。我只是想检查我知道即将发生的特定更改。
答案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'
使用后
--
我们得到一个成功的命令:$ 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.
pdfgrep
被编程为理解--
以下命令行参数不是选项。大多数程序都是这样做的,但是并非所有程序都能理解--
对于那些没有的程序,解决方案是在文件名前面加上./
,如下所示:pdfgrep -i posix ./-find.pdf ./-xorg.pdf
这应该适用于任何命令,除非由于某种原因该命令不能接受路径,而只能接受纯文件名。
有关命令行的一般介绍,请参阅这个有用的 PDF。
答案2
您可以在文件名前面加上./
(或其他可用的相对或绝对路径)。这样它就具有可移植性。
例子:
for zefile in ./*.tmp
do
rm -f "$zefile"
done
用来--
表示选项结束并不总是可用的。有些命令知道这一点,有些则不知道。而且这会在不同的系统上发生变化。所以最终它的可移植性较差。