我有一个文件集合( *.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>但这不起作用
发布于 2016-07-20 00:59:11
尝试:
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它的工作原理:
grep选项和参数-r告诉grep递归地搜索目录结构。(在FreeBSD上,-r将跟随符号链接进入目录。无论是OS/X还是最新版本的GNU grep都不是这样。)--include '*.txt'告诉grep只返回名称与*.txt匹配的文件(包括隐藏的文件,如.foo.txt或.txt)。-l告诉grep只返回匹配文件的名称,而不是返回匹配本身。--null告诉grep使用NUL字符来分隔文件名。(--null由grep在GNU/Linux、MacOS和FreeBSD下支持,但不支持OpenBSD。)LINUX/UNIX告诉grep只查找其内容包括regex LINUX/UNIX的文件。.在当前目录中搜索。您可以在最新版本的GNU grep中省略它,但是需要将一个--选项终止符传递给cp,以防止以-开头的文件名。xargs选项和参数-0告诉xargs期待以NUL分隔的输入。-r告诉xargs,除非找到至少一个文件,否则不要运行该命令。( BSD或OSX都不需要此选项,并且与OSX的xargs不兼容。)cp -t /path/to/dest将目录复制到目标目录。(-t需要GNU cp。)发布于 2016-07-20 01:43:46
更可移植(POSIX功能仅限于):
find . -type f -name '*.txt' -exec grep -q LINUX/UNIX {} \; -exec cp {} /path/to/dest \;发布于 2019-01-09 22:08:22
我不知道为什么原来的字符串不起作用。下面的命令对我有用。
查找/ -name (filename*) AC.26 grep‘(filename.extention)’xargs cp -t .
在我的例子中,filename*是具有不同文件类型(txt、zip等)的同名文件的集合。我执行grep只查找filename.txt并将其复制到我的目标目录(当前为./)。
https://unix.stackexchange.com/questions/297006
复制相似问题