【问题标题】:find with spaces in filename查找文件名中的空格
【发布时间】:2012-09-20 16:47:20
【问题描述】:

我经常将 grep 与 find 一起使用两次,以便在文件中搜索两个模式,如下所示:

find . -name \*.xml | xargs grep -l "<beans" | xargs grep singleton

然后我遇到了带有空格的文件,这当然破坏了上述命令。我对其进行了如下修改以处理空格:

find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs grep singleton

选项 -print0 告诉 find 使用 print null 作为分隔符而不是空格,-0 告诉 xargs 期待 null。只要我要查找的文件的路径中没有空格,这就会起作用,但如果有,就会中断。

所以我需要一个标志来告诉 grep 打印 null 作为 speartor 而不是换行符。

有什么想法吗?

【问题讨论】:

    标签: bash grep find xargs


    【解决方案1】:

    为了避免空格问题,我会使用换行符作为带有 -d 选项的 xargs 的分隔符:

    xargs -d '\n' ...
    

    对于两个单独的模式搜索,我会使用 egrep:

    egrep '(pattern one|pattern two)' ...
    

    所以我的完整解决方案是:

    find . -name \*.xml | xargs -d '\n' egrep '(pattern one|pattern two)'
    

    【讨论】:

      【解决方案2】:

      如果您使用 GNU Parallel 而不是 xargs,那么您可以避免处理这个问题,因为 GNU Parallel 默认情况下会在换行符而不是空格上拆分。

      find . -name \*.xml | parallel grep -l "<beans" | parallel grep singleton
      

      观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

      【讨论】:

        【解决方案3】:
        find . -name "*.xml"  -exec grep -q "<beans" {} \; -exec grep -q "singleton" {} \; -print
        

        如果您打算像上面所做的那样在以后的管道序列中使用这些文件名,请将 -print 更改为 -print0

        【讨论】:

          【解决方案4】:

          好问题。您可以使用 Z 选项使 grep -l 使用空值作为分隔符:

          find . -name \*.xml -print0 | xargs -0 grep -lZ "<beans" | xargs grep singleton
          

          您还可以将 xargs 设为换行符作为分隔符。这也应该适用:

          find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs "--delimiter=\n" grep singleton
          

          第一个解决方案更好。

          【讨论】:

            猜你喜欢
            • 2013-04-17
            • 2018-04-08
            • 2017-10-18
            • 2012-09-07
            • 2020-11-25
            • 1970-01-01
            • 2012-07-07
            • 1970-01-01
            相关资源
            最近更新 更多