文件中的grep单词,然后复制文件


9

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

我执行以下操作:

find . -name "*.txt" | grep 'LINUX/UNIX'

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

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

我试图申请 xargs

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>

但这没用


Answers:


21

尝试:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest

由于此命令使用NUL分隔符,因此对于所有文件名(包括那些名称很难包含空白,制表符甚至换行符的文件名)都是安全的。

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

grep -rl --null --include '*.txt' LINUX/UNIX . | 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字符分隔文件名。(--null被支承grep的GNU / LinuxMacOS的FreeBSD的 OpenBSD的。)

    • 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。)


对于Mac OS X,可能还有BSD,您将要使用--null而不是-Z。另外,我认为cp -t它仅适用于Linux。
爱德华·福尔克

1
@EdwardFalk好点。谢谢。我更新为使用--null并添加了不使用的BSD / OSX版本cp -t
John1024 '16

@StéphaneChazelas感谢您的改进。
John1024 '16

1
OpenBSD grep没有--null
库沙兰丹

@Kusalananda谢谢。更新了答案以注意OpenBSD不支持--null
John1024 '18年

14

更加便携(仅POSIX功能):

find . -type f -name '*.txt' -exec grep -q LINUX/UNIX {} \; -exec cp {} /path/to/dest \;

3

以下sh / Bash一个衬里是另一种方法,尽管仅在当前目录中有效,并且不递归:

for f in ./*.txt; do if grep -l 'LINUX/UNIX' "$f"; then cp "$f" /path/to/dest/; fi; done

-l选项的grep将打印正在被复制的文件列表,虽然你可以使用-q,如果你不想在屏幕上看到任何东西。


0

我不确定为什么原始字符串不起作用。以下命令对我有效。

查找/-名称(文件名*)| grep'(文件名。扩展名)'| xargs cp -t ./

在我的情况下,filename *是具有不同文件类型(txt,zip等)的同名​​文件的集合。我执行grep来仅查找filename.txt并将其复制到我的目标目录(当前为./)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.