Grep命令查找包含文本字符串的文件并将其移动


15

我可以使用以下命令在包含特定文本字符串的文件夹中找到文件:

grep -lir 'string' ~/directory/*

如何将以上结果中出现的文件移动到另一个位置?


这里是。 grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
艾伦·董

Answers:


10

与往常一样,当心grep -r-r这不是一个标准选项,在某些实现中,例如GNU的所有版本,但非常新的版本grep,它在降下目录树时会遵循符号链接,这通常不是您想要的,并且可能会产生严重的影响,例如,如果存在到“ /在目录树中的某个位置。

在Unix哲学中,使用命令在目录中搜索文件,然后使用另一命令查看其内容。

使用GNU工具,我会做:

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
  ) mv -i --target-directory /dest/dir

但是即使这样,如果您以一个用户在其他用户可写的目录上运行它,也要注意竞争状况和可能的安全问题。


这给了我一个错误查找:'grep'被信号13终止。任何想法出了什么问题?
Reena Parekh

@ReenaParekh,那将是SIGPIPE。仅当xargs在读取其arg文件的末尾之前退出时才会发生这种情况,除非xargs自身被杀死或由于任何原因而失败,否则这种情况不会发生,在这种情况下,我希望您也看到有关此错误的信息。
斯特凡Chazelas

15

使用xargs与演唱会mv的第三句法:mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

注意包含特殊字符(空格,引号)的文件。如果是这种情况,请使用过滤列表sed(使用来在文件名周围加上引号s/^/'/;s/$/'/)可能会有所帮助,但是您必须确保,这些引号不会出现在文件名中。GNU grep具有-Z/ --null选项以NUL终止文件名。

第三种语法的替代方法mvxargs与占位符字符串(-I)一起使用。

另一个选择是命令替换- $( )``ire_and_curses的答案中提到的反引号(以bash表示)。


3
gnu grep支持-Z标志以零字节字符分隔文件名,当与-0标志一起使用xargs时,它可以解决您提到的特殊字符问题
iruvar,2012年

@ChandraRavoori谢谢,我已经更新了答案。
彼得2012年

7

如果您的文件名不包含任何特殊字符(空格或\[*?),请使用命令替换

mv `grep -lir 'string' ~/directory/*` destination/

反引号已弃用;而是使用更具可移植性,可读性和可堆叠性的$(...)。
用户未知,

2

仅使用POSIX指定的功能,并且假设文件名:

find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;

笔记:

您说的是“字符串”而不是“模式”,因此-F(固定字符串搜索)选项grep似乎合适。

如果目标目录位于搜索目录内的任何位置,则可能会出现一些不愉快的竞争状况。

的POSIX规格 grep

的POSIX规格 find


这可能是Macos / BSD上的最佳解决方案
阿里(Ali)

0

使用GNU parallel

grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'

ht / @ lin-dong对xargs的原始回答。


如果您在一年多以前的评论中称赞@lindong的回答,那将很好。
roaima '16

0

-假设您的目标目录为“外部”,并且需要移动所有XLS文件,则可以尝试以下命令

须藤MV find /var/log/ -type f -name "*.xls"/外部/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.