我正在尝试撰写一份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
您可以将一个目录作为目标传递给grep
with-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)
归档时间: |
|
查看次数: |
3035 次 |
最近记录: |