我正在尝试递归搜索字符串,grep
但我得到了这个:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
如何防止 Bash 传递以-
as 参数开头的文件?
答案1
首先,请注意,以破折号开头的参数的解释取决于正在启动的程序grep
或其他程序。 shell 没有直接的方法来控制它。
假设您想要处理此类文件(而不是完全忽略它们),grep
与大多数程序一样,会识别--
为指示选项结束,因此
grep -r -e "stuff" -- *
会做你想做的事。那里-e
的 case也stuff
以 a 开头。-
或者,您也可以使用:
grep -r -e "stuff" ./*
-
如果当前目录中有一个文件被调用,后一个也可以避免这个问题。即使在--
分隔符之后,grep
也解释-
为 stdin,而是在当前目录中./-
调用的文件。-
答案2
到防止 Bash 扩展传递以“-”开头的文件您可以使用:
echo [!-]*
它可以在大多数 shell 中移植,或者特定于 ksh、bash、zsh:
echo !(-*)
例如:在包含此文件的目录中
$ echo *
a b c ---corporate-discount.csv d -e --option.txt
仅列出(前提extglob
是处于活动状态):
$ shopt -s extglob
$ echo !(-*)
a b c d
$ echo [!-]*
a b c d
但是,如果您想要处理所有文件,同时告诉 grep 避免解释使用 a-
作为选项声明的文件,那么只需添加一个./
:
grep -r "stuff" ./*
或者,如果保证-
列出的文件中不存在完全被调用的文件(grep 会将孤独解释-
为从标准输入读取), 您可以使用:
grep -r -- "stuff" *