我正试图撰写一份grep
声明,但它快要了我的命。我也厌倦了收到arguments list too long
错误。我有一个文件,我们称之为subset.txt
。它包含数百行带有特定字符串的行,例如MO43312948
.在我的对象目录中,我有数千个文件,我需要将包含列出的字符串的所有文件复制subset.txt
到另一个目录中。
我试图从这里开始,只从对象目录返回匹配的文件。
grep -F "$(subset.txt)" /objects/*
我不断收到“bash: /bin/grep: 参数列表太长”
答案1
您可以将目录作为目标传递给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.
所以,您正在寻找:
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。