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

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

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

grep -lir 'string' ~/directory/*

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

答案1

与的第三种语法xargs配合使用:mvmv [OPTION]... -t DIRECTORY SOURCE...

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

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

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

另一种选择是命令替换 -$( )或反引号``(在 bash 中),如 ire_and_curses 的答案中提到的。

答案2

一如既往,要小心grep -r-r不是标准选项,并且在某些实现中,例如除最新版本的 GNU 之外的所有实现中grep,它在目录树下降时遵循符号链接,这通常不是您想要的,并且如果例如存在指向“/”的符号链接,则可能会产生严重影响" 目录树中的某处。

在 Unix 哲学中,您使用一个命令来搜索目录中的文件,并使用另一个命令来查看其内容。

使用 GNU 工具,我会这样做:

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

但即便如此,如果您以一个用户身份在其他用户可写入的目录上运行它,请注意竞争条件和可能的安全问题。

答案3

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

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

答案4

使用GNU并行:

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

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

相关内容