我的grep版本是grep (BSD grep) 2.5.1-FreeBSD,我的操作系统是OSX 10.13.3 (17D47)。
我有一个gitbook repo,并且有一个名为_book的临时目录,在使用grep时我想忽略它。
当我使用grep -Fnrl mysql ./ --exclude-dir={_book}时,它没有排除_book目录。结果就像
...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh
.//_book/search_jieba_index.dat
.//_book/LANGUAGES/awk/awk_magic.html但是命令grep -Fnrl mysql ./ --exclude-dir "_book"给了我我所期望的结果
...
.//UTILITIES/my_utils/shell_scripts/get_several_days_mysql_data_log.sh我已经搜索了堆栈溢出,并找到了一个问题,它提到了第一个命令样式,并获得了3次向上,所以我想它在某些情况下是有效的。
问题链接是:使用grep和--不包括标志排除多个目录。
为什么会发生这种情况?
如果我想使用第一个命令样式成功地排除_book,该怎么办?
发布于 2018-03-27 02:43:22
这些都不是不同的“命令样式”。他们使用的是bash特性,而不是grep特性。
通过运行来阅读它:
LESS='+/Brace Expansion' man bash当大括号中有逗号分隔的值时,shell会在grep看到它们之前将它们展开为多个参数。
因为您只是在传递一个目录,所以不需要进行大括号扩展。
如果使用大括号之间只有一个项(没有逗号,也没有双句点来表示范围),则shell将大括号单独保留。留给grep的是文字名{_book},它不是要排除的目录。
值得一提的是,你也不需要双引号。
grep -Fnrl mysql ./ --exclude-dir _book...will工作得很好。
双引号没有什么坏处,但它们也没有必要。您可以在所有参数上使用它们,结果是相同的,因为引用被shell删除--在grep看到它们之前。
grep '-Fnrl' "mysql" './' "--exclude-dir" \_\b\o\o\k您甚至可以引用命令名本身'grep',尽管这有稍微不同的含义。具体来说,它取消了别名查找。例如,在Ubuntu系统上,grep通常被别名为grep --color=auto。引用"grep" (或其任何部分)将绕过这个别名。
gr\ep -Fnrl mysql ./ --exclude-dir _book这个故事的寓意是,理解你所用的语言的引用规则。
或者你可以“犯”错误,结果令人困惑。
https://unix.stackexchange.com/questions/433729
复制相似问题