【问题标题】:Scaling up grep find and copy to large folder (xargs?)扩大 grep 查找并复制到大文件夹(xargs?)
【发布时间】:2014-02-22 02:13:03
【问题描述】:

我想在目录中搜索与任何单词列表匹配的任何文件。如果文件匹配,我想将该文件复制到新目录中。我创建了一小批测试文件,并得到了以下代码:

cp `grep -lir 'word\|word2\|word3\|word4\|word5' '/Users/originallocation'` '/Users/newlocation'

不幸的是,当我在包含几千个文件的大文件夹上运行此代码时,它说参数列表对于cp 来说太长了。我想我需要循环这个或使用xargs,但我不知道如何进行转换。

【问题讨论】:

    标签: bash grep xargs cp


    【解决方案1】:

    没有grep -r 的人的替代解决方案。使用find + egrep + xargs,希望不同文件夹中没有同名文件。其次,我替换了word\|word2\|word3\|word4\|word5的丑陋风格

    find . -type f -exec egrep -l 'word|word2|word3|word4|word5' {} \; |xargs -i cp {}  /LARGE_FOLDER
    

    【讨论】:

    • 您的报价不匹配。另外,如果egrep -lrxargs 可以完成这项工作,就像@John1024 的回答一样,那么将find 添加到组合中有什么好处?
    • 我的系统(solaris)不支持grep -r,这个带find的命令会很常见。二是我不喜欢"word\|word2\|word3\|word4\|word5'的风格,个人习惯。
    • 知道了。也许您应该按照“没有grep -r 的人的替代解决方案”的方式在您的帖子前面加上这一点。通过不匹配的引号,我的意思是您的字符串文字已损坏:它以 " 开头并以 ` 结尾。
    【解决方案2】:

    您所拥有的最小变化是:

    grep -lir 'word\|word2\|word3\|word4\|word5' '/Users/originallocation' | \
      xargs cp -t '/Users/newlocation'
    

    但是,不要使用它。因为您永远不知道何时会遇到包含空格或换行符的文件名,所以应该使用以空字符结尾的字符串。在 linux/GNU 上,将 -Z 选项添加到 grep 并将 -0 选项添加到 xargs:

    grep -Zlir 'word\|word2\|word3\|word4\|word5' '/Users/originallocation' | \
      xargs -0 cp -t '/Users/newlocation'
    

    在 Mac(和 AIX、HP-UX、Solaris、*BSD)上,grep 选项略有变化,但更重要的是,GNU cp -t 选项不可用。解决方法是:

    grep -lir --null 'word\|word2\|word3\|word4\|word5' '/Users/originallocation' | \
      xargs -0 -I fname cp fname '/Users/newlocation'
    

    这样效率较低,因为必须为每个要复制的文件运行 cp 的新实例。

    【讨论】:

    • +1:请注意,GNU cp-t target 选项非常有用,但不适用于cp 的其他变体。
    • @JonathanLeffler 是的,我刚刚添加了一个解决方法。除了Mac,还有没有-t的重要平台?
    • 这取决于您对“重要”的定义。 AIX、HP-UX、Solaris、*BSD 均受影响;基本上,只有使用 GNU 核心工具(或类似工具)的平台才拥有它,而 AFAIK 意味着 Linux 有,而其他所有类 Unix 都没有。我再也无法访问 AIX、HP-UX、Solaris(过去 9 个月左右),但从那时起它们可能就没有改变过。
    • @JonathanLeffler 再次感谢。
    • @John1024:很好的答案,但是(a)在 OSX 上 GNU 的 -Z 选项等效于 --null 和(b)我希望你将 -Z/-0 组合成第一个和推荐解决方案:确实没有充分的理由不使用它。
    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2017-12-22
    相关资源
    最近更新 更多