【问题标题】:Better way to limit the unix command find by filename限制通过文件名查找的 unix 命令的更好方法
【发布时间】:2011-03-01 02:34:08
【问题描述】:

我使用带有“~”和 .swp 等文件名的 find 来获得结果。所以我做了以下操作,但有没有更好的方法来做到这一点? '.*.js' -iname '*.js' 部分感觉“多余”。

$ find ./ '.*.js' -iname '*.js' -print0 | xargs -0 grep -n ".*loginError.*"
find: `.*.js': No such file or directory
./js/signin.js:252:                               foo.loginError();
./js/signin.js:339:foo.loginError = function() {
./js/signin.js:340:    foo.log("ui.loginError");

【问题讨论】:

  • 您的 '.*.js' 参数是多余的,它被解释为您当前位置的相对路径名(它不用作查找中的模式),如您所见,导致 find 打印错误(输出中的第一行)
  • grep 模式两端的.* 也是多余的。你可以简单地省略它们。 grep -n "loginError"

标签: bash find xargs


【解决方案1】:

尝试使用

find . -name \*.js -print0 | xargs -0 grep -n ".*loginError.*"

这只会找到扩展名为 'js' 且不以 ~ 或 .swp 结尾的文件

编辑:添加 '0' -print0(编辑需要 6 个字符,所以我添加了这个;呃!)

【讨论】:

    【解决方案2】:

    要在没有 xargs 的情况下在一个命令中完成所有操作,您可以这样做

    find . -name "*.js" -exec grep -n ".*loginError.*" /dev/null {} \;
    

    /dev/null 部分是让 grep 认为它正在搜索多个文件,然后它会正确输出文件名,否则它只会打印出行号而不告诉你它在哪个文件中

    【讨论】:

    • 另一种打印文件名的方法是 find . -name "*.js" -exec grep -n "loginError" {} \; -print - 我还从 grep 中删除了 .*s,它只会感染着色的内容(图案/整行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2011-11-01
    • 2016-05-18
    相关资源
    最近更新 更多