捲曲 .gz 檔案並透過管道將其解壓縮

捲曲 .gz 檔案並透過管道將其解壓縮

我正在嘗試從給定的 URL 下載一些.gz文件(注意不是.tar.gz文件)並解壓縮它們以覆蓋現有文件(如果有)。

對於每個單獨的下載,我嘗試了以下操作:

curl -O $URL | gunzip -f

但是,這不起作用,因為它失敗了:gzip: stdin: unexpected end of file。我在 bash shell 腳本中執行了一系列此命令。

如果我將命令分成兩個明確的步驟,即首先下載文件,然後解壓縮文件.gz,它就可以工作。

為什麼管道版本不起作用?

答案1

管道(以|符號表示)發送標準輸出一個進程的標準輸入另一個。在您的情況下,您似乎想要使用命名文件,因此管道不合適 - 具體來說,沒有任何內容可以通過管道(因此出現錯誤gunzip),因為遠端內容將發送到本地文件。相反,您需要提取文件的名稱 - 例如,從其 URL - 類似於(使用 bash 的內建字串操作功能)

curl -O "$URL" && gunzip -f "${URL##*/}"

如果你想使用管道,那麼這樣做的方法就像

curl "$URL" | gunzip -c

(不含該-O選項)以便curl將遠端內容串流傳輸到stdout可以透過管道傳輸到的位置gunzip,但隨後您需要重定向gunzip輸出以根據需要覆蓋目標未壓縮檔案。

答案2

下載時遵循重定向。有時,出於安全性和/或隨機原因,Web 伺服器會隱藏重定向。如果您不遵循重定向,則會下載錯誤的數據,並且讀取管道數據的應用程式會變得混亂。您可以使用 -L 標誌透過curl 追蹤重定向。

curl -L https://example.com/mygzip.tar.gz | tar zxv

答案3

下面做了 3 件事

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. 強制建立目標目錄
  2. 將存檔取消存檔到給定目錄
  3. 只需刪除已存檔的根目錄即可將根目錄替換為給定的目錄名稱。

相關內容