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)
这个怎么运作:
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 / Linux,MacOS的和FreeBSD的但不 OpenBSD的。)
LINUX/UNIX 告诉 grep 只查找内容包含正则表达式的文件 LINUX/UNIX
.在当前目录中搜索。您可以在最新版本的 GNU 中省略它grep,但是您需要传递一个--选项终止符 tocp以防止以-.
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)
| 归档时间: |
|
| 查看次数: |
33262 次 |
| 最近记录: |