Gzip

使用 tar -xzvf 刪除虛假目錄,同時進行壓縮

  • September 13, 2021

我想修剪 gunzipped tarball 的路徑,以便排除一些“虛假”的前導目錄。讓我用一個例子來解釋。

我有以下目錄結構,由tree命令輸出:

tree /tmp/gzip-expt

/tmp/gzip-expt
├── gunzip-dir
├── gzip-dir
└── repo
   └── src-tree
       ├── l1file.txt
       └── sub-dir
           └── l2file.txt

5 directories, 2 files

我想在 gzip-dir 中壓縮 src-tree 所以這就是我要做的:

cd /tmp/gzip-expt/gzip-dir
tar -czvf file.tar.gz /tmp/gzip-expt/repo/src-tree

隨後我在 gunzip-dir 中 gunzip file.tar.gz 所以這就是我所做的:

cd /tmp/gzip-expt/gunzip-dir
tar -xzvf /tmp/gzip-expt/gzip-dir/file.tar.gz

tree /tmp/gzip-expt/gunzip-dir顯示以下輸出:

/tmp/gzip-expt/gunzip-dir
└── tmp
   └── gzip-expt
       └── repo
           └── src-tree
               ├── l1file.txt
               └── sub-dir
                   └── l2file.txt

但是,我想tree /tmp/gzip-expt/gunzip-dir顯示以下輸出:

/tmp/gzip-expt/gunzip-dir
└── src-tree
   ├── l1file.txt
   └── sub-dir
       └── l2file.txt

換句話說,我不想看到路徑的“虛假” tmp/gzip-expt/repo 部分。

它們不是虛假的,它只是儲存它被告知儲存的內容。

特別是,給定 path /tmp/gzip-expt/repo/src-tree,它不知道應該保留路徑的哪些部分,如果文件應該儲存為/tmp/gzip-expt/repo/src-tree/l1file.txt,或者src-tree/l1file.txt等等l1file.txt。它在提取 tarball 時會有所不同,如果存檔具有前導目錄,它是在提取時創建的。如果不是,那就不是。

給出tar一個相對路徑,並讓它在正確的目錄中執行以使相對路徑正常工作:

cd /tmp/gzip-expt/repo
tar -czvf /tmp/gzip-expt/gzip-dir/file.tar.gz ./src-tree

或者

cd /tmp/gzip-expt/gzip-dir
tar -C /tmp/gzip-expt/repo -czvf file.tar.gz ./src-tree

GNU 手冊頁描述-C為:

-C,--directory=DIR 在執行任何操作之前更改為 DIR。這個選項是順序敏感的,即它影響後面的所有選項。

但據我所見,由 給出的文件-f仍然是從目錄tar開始使用的,即使-C是先給出的。

如果你想在提取時修復它,至少 GNU tar 有它告訴它刪除文件名的前導部分。例如,使用 .like 的文件名將被提取為.--strip-components=*N*``--strip-components=2``/tmp/gzip-expt/repo/src-tree/...``repo/src-tree/...

引用自:https://unix.stackexchange.com/questions/668784