在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实例,我希望能够有效地将文件传递到下一步,我认为这将受到网络速度的限制。
答案 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
参数的缺少。
如果要插入缓冲区(以允许tar
在xargs
进程之前运行),请考虑pv
:
tar xvzf large.tar.gz \
| pv -B 1M \
| buffer_lines \
| xargs -d $'\n' -n 1 -P8 do_something_to_file
如果处理组件在后面运行,...将缓冲多达1MB的解包名称。