Bash 如何使用grep在当前目录中搜索具有给定字符串的所有文件,然后将这些文件移动到新文件夹?

Bash 如何使用grep在当前目录中搜索具有给定字符串的所有文件,然后将这些文件移动到新文件夹?,bash,unix,grep,Bash,Unix,Grep,我已经设法分别使用 grep -r "zone 19" path mkdir zone19 find . -name "ListOfFilesfromGrep" -exec mv -i {} zone19 \; 我只是不知道如何将这两者结合起来,也就是说,如何将我从grep获得的文件列表输入find命令。您可以通过管道将结果从grep导入并使用xargs: grep -lr "zone 19" path | xargs <command> grep-lr“区域19”路径

我已经设法分别使用

grep  -r "zone 19" path

mkdir zone19
find . -name "ListOfFilesfromGrep"  -exec mv -i {}  zone19 \;

我只是不知道如何将这两者结合起来,也就是说,如何将我从grep获得的文件列表输入find命令。

您可以通过管道将结果从
grep
导入并使用
xargs

grep  -lr "zone 19" path | xargs <command>
grep-lr“区域19”路径| xargs
将应用于
grep
的每个结果。注意:thta
-o
标志告诉
grep
仅显示匹配的部分。

您可以尝试

grep -lr "zone 19" path | while read in ; do mv -i "$in" zone19; done

-l
打印匹配字符串的文件名<代码>当。。。完成逐个移动文件。

下面是将包含字符串“Hello”的所有文件移动到文件夹区域19的命令

grep Hello * |cut -f1 -d":"|sort -u|xargs -I {} mv {} zone19

您应该在
find
中使用
grep

find /path/to/dir -type f -exec grep -q "zone 19" {} \; -exec mv -i {} zone19 \;

使用GNU版本的标准工具:

grep-l
将为您提供文件名。
mv-t
将移动到给定目录。
xargs-r
将使用stdin中的参数调用命令,但前提是至少有一个参数

将它们按如下方式组合:

grep -l -r -e 'zone 19' path | xargs -r mv -i -t 'zone19'
或者(如果文件名可能包含换行符等):


难道他们不想移动文件,而不是只对匹配的部分执行操作吗?你应该在中双引号
$以避免文件名中出现空白的问题。回答不错,我不知道你可以在下一次执行中使用上一次执行的结果。因为你假设了GNU实用程序,您应该通过对
grep
使用
-Z
和对
xargs
使用
-0
来增强命令的健壮性,这样命令在包含空格或引号的文件名上就不会失败。我收到错误消息“xargs:invalical option--r”@gniourf\u gniourf-Yes,您的评论与我的编辑有冲突。@Aline-我在xargs版本4.4.2(来自Ubuntu 14.04)中使用了上述命令。您可以省略
-r
而不会造成任何伤害(
mv
如果您不匹配任何文件,只会给出错误消息)。好的,谢谢!我在OSX中,刚刚看到缺少一些xargs选项。
grep -lZr -e 'zone 19' path | xargs -0r mv -it 'zone19'