命令:
grep -rl "KORD" ./
搜索目录并返回文件内容(而不是标题)中包含“KORD”的文件列表。
Users-MacBook-Air:myPhotorec user$ grep -rl "KORD" ./
.//output_apikey.txt
.//recup_dir.17/f13470392.txt
.//recup_dir.49/f45361992.txt
.//recup_dir.49/f45362424.txt
.//recup_dir.53/f48768408.txt
.//recup_dir.53/f49295480.txt
是否有首选命令(xargs?)来增强 grep 命令以将输出文件列表打印到控制台并将每个文件复制到目录: ./ORD ?
我怀疑“剥猫皮”的方法不止一种:我期待看到不止一种解决方案
JOHN1024 的 XARGS 解决方案
重复的标签阻止将此修改后的帖子发布为答案:
尝试:
grep -rl --null --include '*.txt' KORD . | xargs -0r cp -t /path/to/dest
由于此命令使用 NUL 分隔,因此对于所有文件名都是安全的,包括那些名称复杂、包含空格、制表符甚至换行符的文件名。
以上需要 GNU cp
。对于 BSD/OSX,请尝试:
grep -rl --null --include '*.txt' KORD . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh
怎么运行的:
grep
选项和参数-r
告诉 grep 在目录结构中递归搜索。 (在 FreeBSD 上,-r
将跟随符号链接进入目录。对于 OS/X 或最新版本的 GNU 来说,情况并非如此grep
。)--include '*.txt'
告诉 grep 只返回名称与 glob 匹配的文件*.txt
(包括隐藏的文件,如.foo.txt
或.txt
)。-l
告诉 grep 仅返回匹配文件的名称,而不返回匹配本身。--null
告诉 grep 使用 NUL 字符来分隔文件名。LINUX/UNIX
告诉 grep 仅查找内容包含正则表达式的文件LINUX/UNIX
.
在当前目录中搜索。您可以在最新版本的 GNU 中省略它grep
,但是您需要传递一个--
选项终止符来cp
防止以-
.
xargs
选项和参数-0
告诉 xargs 期待 NUL 分隔的输入。-r
告诉 xargs 除非找到至少一个文件,否则不要运行该命令。 (此选项在 BSD 或 OSX 上都不需要,并且与 OSX 不兼容xargs
。)cp -t /path/to/dest
将目录复制到目标目录。 (-t
需要 GNUcp
。)
答案1
find . -type f -exec grep -q 'KORD' {} ';' -exec cp {} ./ORD ';'
这将找到当前目录中或当前目录下的所有常规文件。grep -q 'KORD'
将在每个文件上运行,并且包含匹配行的文件将被复制到目录./ORD
.
如果您安装了 GNU coreutils,那么您可以使用效率稍高的
find . -type f -exec grep -q 'KORD' {} ';' -exec cp -t ./ORD {} +
也可以看看:了解“find”的 -exec 选项