如何将完成 tar xzf 解压缩的每个文件传递给 bash 循环?

How to pass through each file that's completed tar xzf decompression to a bash loop?

在Linuxbash中,我希望能够解压一个大的tar.gz(100G-1T,数百个大小相似的文件),这样每个文件都有解压成功,我可以通过 bash 循环进行进一步处理。请参阅下面的示例 --desired_flag:

tar xzf --desired_flag large.tar.gz \
 | xargs -n1 -P8 -I % do_something_to_decompressed_file % 

编辑:我正在考虑的直接用例是网络操作,一旦被解压缩的文件的内容可用,就可以在下一步将它们上传到某个地方。鉴于 tar 步骤可以是 CPU 绑定或 IO 绑定,具体取决于 Linux 实例,我希望能够有效地将文件传递到下一步,即我想会受到网络速度的限制。

给定以下函数定义:

buffer_lines() {
  local last_name file_name
  read -r last_name || return
  while read -r file_name; do
    printf '%s\n' "$last_name"
    last_name=$file_name
  done
  printf '%s\n' "$last_name"
}

...然后可以 运行 以下内容,无论 tar 实现在处理的开始还是结束时打印名称:

tar xvzf large.tar.gz | buffer_lines | xargs -d $'\n' -n 1 -P8 do_something_to_file

注意 v 标志,告诉 tar 在标准输出上打印文件名(在 GNU 实现中,在这种特定的使用模式下)。另请注意 缺少 -I 参数。


如果要插入缓冲区(允许 tar 到 运行 在 xargs 过程之前),请考虑 pv:

tar xvzf large.tar.gz \
  | pv -B 1M \
  | buffer_lines \
  | xargs -d $'\n' -n 1 -P8 do_something_to_file

...如果处理组件 运行 落后,将缓冲最多 1MB 的解压缩名称。