AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 705637
Accepted
user7211
user7211
Asked: 2022-06-10 21:10:30 +0800 CST2022-06-10 21:10:30 +0800 CST 2022-06-10 21:10:30 +0800 CST

管道查找文件列表到 xargs gzip 并再次管道到 pigz

  • 772

我需要找到比 x 天新的文件,然后将其转换为 gzip,但我想使用 pigz 来完成。

现在我正在以缓慢的方式进行;这有效:

find /path/to/src -type f -mtime -90 | xargs tar -zcf archive.tar.gz

但是pigz速度非常快,所以我想用 pigz 来运行这个 gzip。我试过这个,但它不工作:

find /path/to/src -type f -mtime -90 | xargs tar -zcf | pigz > archive.tar.gz

它返回一个错误,因为我只是猜到了要做什么(并尝试了几种方法):

tar (child): /path/to/src: Cannot open: Is a directory
tar (child): Error is not recoverable: exiting now

如何采取第一条有效的线路并将其输送到pigz?

files tar
  • 2 2 个回答
  • 283 Views

2 个回答

  • Voted
  1. Stéphane Chazelas
    2022-06-10T22:12:07+08:002022-06-10T22:12:07+08:00

    假设 GNU 或 libarchive 的tar:

    find /path/to/src -type f -mtime -90 -print0 |
      tar -cf - --no-recursion --null -T - |
      pigz > archive.tar.gz
    

    (--no-recursion这里不是绝对必要的,因为报告的文件find不是目录类型)。

    不要使用(无论如何,如果你使用and 'sxargs只能在find' 输出上使用),因为它最终可能会运行多个,所以你最终会得到只包含最后一批的存档。-0find-print0tar

    在这里,我们tar通过管道直接将文件列表传递给,-T -因此可以通过这种方式传递的文件数量没有限制。这也意味着tar可以在找到文件后立即开始存档。

    star(@schily的 (RIP) tar)还具有内置find功能:

    star cf - -find /path/to/src -type f -mtime -90 |
      pigz > archive.tar.gz
    

    不过,您也可以使用以下语法采用与上述其他两种方法相同的方法:

    find /path/to/src -type f -mtime -90 -print0 |
      star cf - -read0 list=- |
      pigz > archive.tar.gz
    

    tar是一个非常不便携的命令。甚至 tar 格式也是不可移植的。X/Open / SUSv2 曾经指定一个tar命令(和cpio),但他们最终放弃了它,因为无法协调tar来自不同供应商的 s,而是 POSIX / SUS 想出了pax作为两者的替代品。

    pax从标准输入获取文件列表,但不幸的是,换行符分隔而不是 NUL 分隔,这意味着它不能归档任意文件名,尽管某些pax实现支持-0扩展名(虽然可以替换为find's-print0也不是 POSIX -exec printf '%s\0' {} +)。所以,有了这些:

    find /path/to/src -type f -mtime -90 -print0 |
      pax -0w |
      pigz > archive.tar.gz
    

    (请注意,每个 POSIX 的默认输出格式是未定义的,这是 . 的另一个弱点pax。它最大的弱点是它的采用率非常低)。

    • 4
  2. Best Answer
    cas
    2022-06-10T22:12:22+08:002022-06-10T22:12:22+08:00

    在任何支持进程替换的 shell (例如 bash、ksh、zsh)上使用 GNU tar:

    tar cf archive.tar.gz -I pigz --null -T <(find /path/to/src  -type f -mtime -90 -print0)
    

    这用于进行压缩,并通过or选项和进程替换pigz将(NUL 分隔的)文件列表从 的输出中包含在存档中。find ... -print0-T--files-from=FILE

    或者,如果您使用的是仅具有 POSIX 功能的极简 shell(例如 ash 或 dash,或者 bash 运行为 /bin/sh或使用--posix或set -o posix使用POSIXLY_CORRECT环境变量集),您可以将 NUL 分隔的文件名列表通过管道传输到 GNU tar。以下选项告诉 tar 从标准-输入-T读取文件列表。

    find /path/to/src  -type f -mtime -90 -print0 | tar cf archive.tar.gz -I pigz --null -T -
    

    其中任何一个都适用于任何有效的文件名,即使是那些包含空格、换行符和 shell 元字符的文件名。它还避免了@Kusalananda 在他的评论中提到的文件名过多的问题。

    顺便说一句,您可能想使用pixz而不是pigz. 它进行xz压缩(通常比 gzip 压缩得更好,但速度较慢),如果 pixz 检测到类似 tar 的输入,它会添加一个索引来加速特定文件的提取。顺便说一句,两者pixz都xz-utils为最常见的 Linux 发行版打包,所以应该很容易安装。

    • 4

相关问题

  • 列出根据特定内容行排序的文件

  • bsdtar:如何避免覆盖现有文件信息?

  • 如何提前知道 .zip 内部是否有父目录

  • 如何找到特定的文件类型并将它们 tar?

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve