如何在目录中的数千个文件中查找文件中的数百个字符串

如何在目录中的数千个文件中查找文件中的数百个字符串

我正试图撰写一份grep声明,但它快要了我的命。我也厌倦了收到arguments list too long错误。我有一个文件,我们称之为subset.txt。它包含数百行带有特定字符串的行,例如MO43312948.在我的对象目录中,我有数千个文件,我需要将包含列出的字符串的所有文件复制subset.txt到另一个目录中。

我试图从这里开始,只从对象目录返回匹配的文件。

grep -F "$(subset.txt)" /objects/*

我不断收到“bash: /bin/grep: 参数列表太长”

答案1

您可以将目录作为目标传递给grepwith -R,并传递输入模式文件-f

  -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  If this option is used
          multiple  times  or  is  combined with the -e (--regexp) option,
          search for all patterns given.  The  empty  file  contains  zero
          patterns, and therefore matches nothing.

   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

所以,您正在寻找:

grep -Ff subset.txt -r objects/

您可以通过以下方式获取匹配文件的列表:

grep -Flf subset.txt -r objects/

因此,如果您的最终列表不太长,您可以这样做:

 mv $(grep -Flf subset.txt -r objects/) new_dir/

如果返回argument list too long错误,请使用:

grep -Flf subset.txt -r objects/ | xargs -I{} mv {} bar/

如果您的文件名可以包含空格或其他奇怪的字符,请使用(假设 GNU grep):

grep -FZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

最后,如果您想排除二进制文件,请使用:

grep -IFZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

答案2

使用

grep -F -f subset.txt 

告诉 grep 从subset.txt文件中读取。

您可以使用 find 来遍历文件。

find . -type f -exec grep -F -f subset.txt {} \;

或者

find . -type f -exec grep -F -f subset.txt {}  +

答案3

如果您想进一步加快 grep 的速度,可以在运行之前在 shell 中设置区域设置,即使用“LC_ALL=c”。这将被继承到 grep 中,并在不需要时禁用 Unicode 处理,并且在某些情况下可以显着加快 grep 的速度。可以在以下位置找到记录此内容的精彩博客:http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc-all。这个技巧还可以加速 bash shell 脚本,而不仅仅是 grep。

相关内容