
我使用此命令來歸檔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
答案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
)。我們也說 isFILE
(stdin
直接透過管道傳輸find
到tar
而不是從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 -