進行 tar.gz 壓縮時如何刪除完整路徑?

進行 tar.gz 壓縮時如何刪除完整路徑?

我使用此命令來歸檔g由 Java 程式碼命名的目錄:

tar czf /a/b/c.tar.gz /e/f/g

c.tar.gz創建tar 檔案時,我找到整個路徑,然後找到其中資料夾e/f/g的所有檔案。g但我只想g在打開壓縮包時看到該資料夾下的檔案。如何刪除/e/f/.tar.gz 檔案中的資料夾?

答案1

tar -czf /a/b/c.tar.gz -C /e/f/g .

-C選項會tar變更工作目錄,因此您只需新增..

看:更改工作目錄 – GNUtar手冊

答案2

這個問題是不久前提出的,但我仍然無法輕鬆地為自己找到答案,以使用相對路徑添加具有特定搜尋條件的文件和資料夾。

以下內容涵蓋的主題比所問的主題更廣泛。因此,我正在寫下我在研究後提出的解決方案。

假設您的$input_dir變數指向您感興趣的目錄,並且您希望將所有*.txt檔案 tar 並壓縮(使用 gzip)為~/my_txt.tar.gz.若要建立在 tar 中不儲存路徑(相對路徑)的 gzip 壓縮包,請使用下列命令:

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-

讓我們來分解一下:

  • "$input_dir":起始目錄。將其更改為您喜歡的任何內容。
  • maxdepth 1: 只查看該目錄的根目錄。如果您想搜尋所有或不同級別,您可以刪除或修改它。
  • -type f:僅搜尋文件
  • -name "*.txt":符合 *.txt 標準
  • -printf "%P":輸出相對路徑(手冊頁:「檔案名稱及其被發現已刪除的起始點的名稱」)。
  • -printf "%P\0": null 終止相對路徑輸出
  • | tar:將輸出經由管道傳送到下一個指令,此處為 tar
  • --null:指示後續--files-from選項讀取以 null 結尾的名稱。請記住,我們要求find建立空終止 ( \0) 輸出而不是常規\n終止輸出。這是為了覆蓋所有可能帶有空格或其他特殊字元的檔案名稱。
  • --create:創建 tar 檔案。等於-c
  • --remove-files:我使用此選項在將檔案新增至 tarball 後將其刪除。你可以把它丟掉。
  • --gzip: gzip 壓縮包。等於-z
  • --file="$HOME/my_txt.tar.gz":輸出 gzip 壓縮的 tarball 檔案。等於-f "$HOME/my_txt.tar.gz"
  • --directory="$input_dir":這意味著tar現在更改到此目錄。現在它將查找在此目錄中傳遞的檔案名稱(請記住,我們已經建立了檔案名稱到此資料夾的相對路徑)。等於-C "$input_dir"
  • --files-from=/dev/stdin: 其一般形式為--files-from=FILE.此選項與--null選項指示tar名稱之間FILE以 ASCII NULL 字元分隔,而不是換行符 ( \n)。我們也說 is FILEstdin直接透過管道傳輸findtar而不是從FILE磁碟上讀取)。等於-T -

上面的一些選項可以更改為一個字元選項,並且可以組合。

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -

-t您可以使用或選項檢查文件清單--list

tar -tf "$HOME/my_txt.tar.gz"

現在要將檔案提取到 $output_dir 目錄(存在),請使用以下命令:

tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"

v選項很詳細,您也可以在 tarball 創建期間添加它。

答案3

slhck 答案不允許過濾我們想要的檔案並包含整個目錄,而且 shell 通配將無法使用此目錄選項(請參閱此處描述的此問題:如何使用「更改目錄」選項使 tar 通配工作)。

shaheen g 答案很好,但空字節阻止我在程式語言中使用該命令,因為字串中禁止空字節。因此,當您不需要處理帶有空格的檔案名稱時,我將其調整為沒有空字節的工作,答案這裡

tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")

或者

find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -

相關內容