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

时间:2018-01-28 04:45:56

标签: linux bash tar

在Linux bash中,我希望能够解压缩一个大的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实例,我希望能够有效地将文件传递到下一步,我认为这将受到网络速度的限制。

1 个答案:

答案 0 :(得分:2)

给出以下函数定义:

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在stdout上打印文件名(在GNU实现中,在此特定使用模式下)。另请注意-I参数的缺少

如果要插入缓冲区(以允许tarxargs进程之前运行),请考虑pv

tar xvzf large.tar.gz \
  | pv -B 1M \
  | buffer_lines \
  | xargs -d $'\n' -n 1 -P8 do_something_to_file
如果处理组件在后面运行,

...将缓冲多达1MB的解包名称。