【问题标题】:Piped un-tar kill pipe when finished extracting given file from tarball完成从 tarball 中提取给定文件时,管道化 un-tar 终止管道
【发布时间】:2018-07-18 06:56:33
【问题描述】:

我正在使用 curl 下载一个大 tarball。我只对该压缩包中的一个文件感兴趣。所以目前我正在将 curl 的输出传递给 tar。

$ curl -S http://url/of/big/tarball.tar.gz | tar -xv path/of/one/file

虽然这样可以正常工作。即使所需的文件已经解压,它仍然会完全下载巨大的 tarball。有没有办法在 tar 完成提取所需文件后自动中断它?

编辑:对于任何在网上寻找相同问题的人。我最终创建了一个小型 bash 脚本

trap 'kill $(jobs -p)' EXIT
curl -S "${URL}" | tar -C "${OUTPUT_DIR}" -xv "${FILES[@]}" 2>&1 | head -"${FILES_CNT}" > "${CTRL_FILE}" 2>&1 &
 # Wait for the required files to be found in the tar
until [[ -s "${CTRL_FILE}" && $(wc -l "${CTRL_FILE}" | cut -d' ' -f 8) -ge "${FILES_CNT}" ]]; do
    sleep 10s
done

【问题讨论】:

  • 试试tar -zxv --occurrence=1 path/of/one/file < <(curl -S http://url/of/big/tarball.tar.gz)
  • 我当前的 Mac 不支持 occurrence=1 :(
  • 请发布您的脚本作为答案。
  • 请注意,理论上,同一个文件可以在一个 tar 文件中出现多次。这并不常见,但有一些选项可以做到这一点。你必须决定你想做什么。忽略这种可能性可能是一个有效的决定。

标签: linux bash curl pipe tar


【解决方案1】:
trap 'kill $(jobs -p)' EXIT
curl -S "${URL}" | tar -C "${OUTPUT_DIR}" -xv "${FILES[@]}" 2>&1 | head -"${FILES_CNT}" > "${CTRL_FILE}" 2>&1 &
# Wait for the required files to be found in the tar
until [[ -s "${CTRL_FILE}" && $(wc -l "${CTRL_FILE}" | cut -d' ' -f 8) -ge "${FILES_CNT}" ]]; do
    sleep 10s
done

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2021-07-24
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多