【问题标题】:Assistance with the "find" and "grep" command协助“find”和“grep”命令
【发布时间】:2012-02-10 22:45:10
【问题描述】:

我正在寻求有关可以从 Mac OS X 终端运行的单行程序的帮助。我在 Mac 上使用 MAMP 进行 Web 开发。我的“/Applications/MAMP/htdocs”目录中有很多 CakePHP 项目。为了简单起见,假设我有两个 CakePHP 项目,这是find /Applications/MAMP/htdocs -type d -iname Controller* 命令的输出:

/Applications/MAMP/htdocs/my_cake1.3_project/app/controllers
/Applications/MAMP/htdocs/my_cake1.3_project/app/tests/cases/controllers
/Applications/MAMP/htdocs/my_cake1.3_project/cake/console/templates/skel/controllers
/Applications/MAMP/htdocs/my_cake1.3_project/cake/console/templates/skel/tests/cases/controllers
/Applications/MAMP/htdocs/my_cake1.3_project/cake/libs/controller
/Applications/MAMP/htdocs/my_cake1.3_project/cake/tests/cases/libs/controller
/Applications/MAMP/htdocs/my_cake1.3_project/cake/tests/test_app/controllers
/Applications/MAMP/htdocs/my_cake1.3_project/cake/tests/test_app/plugins/test_plugin/controllers
/Applications/MAMP/htdocs/my_cake2_project/app/Controller
/Applications/MAMP/htdocs/my_cake2_project/app/Test/Case/Controller
/Applications/MAMP/htdocs/my_cake2_project/lib/Cake/Console/Templates/skel/Controller
/Applications/MAMP/htdocs/my_cake2_project/lib/Cake/Console/Templates/skel/Test/Case/Controller
/Applications/MAMP/htdocs/my_cake2_project/lib/Cake/Controller
/Applications/MAMP/htdocs/my_cake2_project/lib/Cake/Test/Case/Controller
/Applications/MAMP/htdocs/my_cake2_project/lib/Cake/Test/test_app/Controller
/Applications/MAMP/htdocs/my_cake2_project/lib/Cake/Test/test_app/Plugin/TestPlugin/Controller

现在,有时我想找到一段我知道在我的一个 CakePHP 项目的控制器中使用的代码,但我不记得它是哪个项目,所以我想搜索所有这些。不过,我不想浪费时间在“app/tests/cases/controllers”文件夹或“cake/”中的任何文件夹中进行搜索。 find /Applications/MAMP/htdocs -type d -iname Controller* | grep -i /app/Controller 命令给了我想要搜索的文件夹列表:

/Applications/MAMP/htdocs/my_cake1.3_project/app/controllers
/Applications/MAMP/htdocs/my_cake2_project/app/Controller

我只需要找到一种方法来获取该输出,在每行的末尾添加一个斜杠和星号 (/*),然后将每一行传递给 grep -il "string to search for" 命令。任何帮助,将不胜感激。谢谢!

【问题讨论】:

    标签: find grep


    【解决方案1】:

    解决方案 1

    也许你想检查 find 命令的两个选项:(i)pathregex 有了它们,您可以缩小查找结果并将找到的文件传递给您的 grep -il "searchString",例如通过 |xargs 。它看起来像:

        find /Applications/MAMP/htdocs -type f -ipath "*/app/Controller/*.php" 
    | xargs grep -il 'foo'  
    

    -regex 会更灵活。

    解决方案 2

    但是如果你真的很想:

    找到一种获取该输出的方法,将斜杠和星号 (/*) 添加到 每行的结尾,并将每一行通过管道传递到 grep -il "字符串以进行搜索 for”命令。

    (顺便说一句,这里的“管道”不起作用。)

    你可以这样做:

    find .(your original find).. |grep -i "/app/Controller" 
     |sed -r 's#^(.*)$#grep -il "foo" \1/*#g'|sh  
    

    这个技巧是由sed....|sh 完成的。 sed 行将选择您之前的 grep 的结果,添加 grep 命令和选项 :(grep -il "foo") 并附加“/*”以构建完整的 grep 命令。最后通过管道传递给 sh,执行它。

    【讨论】:

    • 我得到了两种解决方案!非常感谢你!为了让第一个解决方案满足我的特定需求,我不得不将"*/app/Controller/*.php" 替换为"*/app/Controller*"(CakePHP = 2.0 是“控制器”,没有“s”)。为了让第二种解决方案满足我的特定需求,我不得不将sed -r 替换为sed -E。再次感谢!
    【解决方案2】:

    你试过吗?

    find /Applications/MAMP/htdocs -type d -iname Controller* 
    -exec grep -il "string to search for" {} /;
    

    【讨论】:

    • 问题是我不想浪费时间在“app/tests/cases/controllers”文件夹或“cake/”中的任何文件夹中搜索。不过谢谢!
    猜你喜欢
    • 2014-03-12
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多