如何将完成 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 的解压缩名称。
在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 的解压缩名称。