文件中的 grep 字然后复制文件

10 grep find cp text-processing

我有一组文件( *.zip, *.txt, *.tar.gz, *.doc, ...etc )。这些文件驻留在路径中。我想找到所有文件 (*.txt),然后只复制包含特定单词的文本文件(例如 LINUX/UNIX)。

我运行了以下内容:

find . -name "*.txt" | grep 'LINUX/UNIX'
Run Code Online (Sandbox Code Playgroud)

此命令能够找到所有文本文件,然后“grep”通过仅列出包含“LINUX/UNIX”的文本文件来过滤生成的文本文件。

如何将这些最终文件(即包含“LINUX/UNIX”的文本文件)复制到特定的选择路径?

我试着申请 xargs

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Run Code Online (Sandbox Code Playgroud)

但它没有用

Joh*_*024 23

尝试:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest
Run Code Online (Sandbox Code Playgroud)

因为此命令使用 NUL 分隔,所以它对于所有文件名都是安全的,包括那些包含空格、制表符甚至换行符的复杂名称的文件名。

以上需要 GNU cp。对于 MacOS/FreeBSD,请尝试:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  1. grep 选项和参数

    • -r告诉 grep 在目录结构中递归搜索。(在 FreeBSD 上,-r将按照符号链接进入目录。这不适用于 OS/X 或最新版本的 GNU grep。)

    • --include '*.txt'告诉 grep 只返回名称与 glob 匹配的文件*.txt(包括隐藏的文件,如.foo.txt.txt)。

    • -l 告诉 grep 只返回匹配文件的名称,而不是匹配本身。

    • --null告诉 grep 使用 NUL 字符来分隔文件名。(--null被支承grep的GNU / LinuxMacOS的FreeBSD的 OpenBSD的。)

    • LINUX/UNIX 告诉 grep 只查找内容包含正则表达式的文件 LINUX/UNIX

    • .在当前目录中搜索。您可以在最新版本的 GNU 中省略它grep,但是您需要传递一个--选项终止符 tocp以防止以-.

  2. xargs 选项和参数

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

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

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


Wil*_*ard 14

更便携(仅限 POSIX 功能):

find . -type f -name '*.txt' -exec grep -q LINUX/UNIX {} \; -exec cp {} /path/to/dest \;
Run Code Online (Sandbox Code Playgroud)