放大grep查找并复制到大文件夹(xargs?)



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

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

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

与现有内容相比,最小的变化是:

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

但是,不要用那个。因为您永远不知道什么时候会遇到包含空格或换行符的文件名,所以应该使用以null结尾的字符串。在linuxGNU上,将-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选项略有变化,但更重要的是,GNUcp -t选项不可用。解决方法是:

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

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

不带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

相关内容

  • 没有找到相关文章

最新更新