我可以使用以下命令在包含特定文本字符串的文件夹中找到文件:
grep -lir 'string' ~/directory/*
如何将上述结果中出现的文件移动到另一个位置?
答案1
与的第三种语法xargs
配合使用:mv
mv [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/