我可以使用以下命令在包含特定文本字符串的文件夹中找到文件:
grep -lir 'string' ~/directory/*
Run Code Online (Sandbox Code Playgroud)
如何将出现在上述结果中的文件移动到另一个位置?
pet*_*rph 21
使用xargs与演唱会mv的第三句法:mv [OPTION]... -t DIRECTORY SOURCE...
grep -lir 'string' ~/directory/* | xargs mv -t DEST
Run Code Online (Sandbox Code Playgroud)
小心包含特殊字符(空格、引号)的文件。如果是这种情况,使用sed(在文件名周围添加引号s/^/'/;s/$/'/)过滤列表可能会有所帮助,但您必须确保这些引号不会出现在文件名中。GNUgrep有-Z/--null选项来 NUL 终止文件名。
第三种语法的替代方法mv是使用xargs占位符字符串 ( -I)。
另一种选择是命令替换 -$( )或``ire_and_curses 的回答中提到的反引号(在 bash 中)。
Sté*_*las 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
Run Code Online (Sandbox Code Playgroud)
但即便如此,如果您以一个用户身份在其他用户可写的目录上运行它,请注意竞争条件和可能的安全问题。
如果您的文件名不包含任何特殊字符(空格或\[*?),请使用命令替换:
mv `grep -lir 'string' ~/directory/*` destination/
Run Code Online (Sandbox Code Playgroud)