JOHN1024 的 XARGS 解决方案

JOHN1024 的 XARGS 解决方案

命令:

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

怎么运行的:

  1. 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防止以-.

  2. xargs选项和参数

    • -0告诉 xargs 期待 NUL 分隔的输入。

    • -r告诉 xargs 除非找到至少一个文件,否则不要运行该命令。 (此选项在 BSD 或 OSX 上都不需要,并且与 OSX 不兼容xargs。)

    • cp -t /path/to/dest将目录复制到目标目录。 (-t需要 GNU cp。)

答案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 选项

相关内容