如何为文件中的数百个字符串grep目录中的数千个文件

Rev*_*lis 11 grep

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

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

grep -F "$(subset.txt)" /objects/*
Run Code Online (Sandbox Code Playgroud)

我不断收到`bash: /bin/grep: Argument list too long``

ter*_*don 23

您可以将一个目录作为目标传递给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.
Run Code Online (Sandbox Code Playgroud)

所以,你正在寻找:

grep -Ff subset.txt -r objects/
Run Code Online (Sandbox Code Playgroud)

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

grep -Flf subset.txt -r objects/
Run Code Online (Sandbox Code Playgroud)

所以,如果你的最终清单不是太长,你可以这样做:

 mv $(grep -Flf subset.txt -r objects/) new_dir/
Run Code Online (Sandbox Code Playgroud)

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

grep -Flf subset.txt -r objects/ | xargs -I{} mv {} bar/
Run Code Online (Sandbox Code Playgroud)

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

grep -FZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/
Run Code Online (Sandbox Code Playgroud)

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

grep -IFZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/
Run Code Online (Sandbox Code Playgroud)


Arc*_*mar 11

grep -F -f subset.txt 
Run Code Online (Sandbox Code Playgroud)

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

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

find . -type f -exec grep -F -f subset.txt {} \;
Run Code Online (Sandbox Code Playgroud)

或者

find . -type f -exec grep -F -f subset.txt {}  +
Run Code Online (Sandbox Code Playgroud)