tar的「change directory用法」注意事項

原始討論

原始討論「回覆: 請問tar壓縮的時候要怎麼去掉”全部”的路徑」。

回覆內容

紀錄測試結果

操作環境

  • Xubuntu 16.04 (64位元) 英文界面
  • file-roller 3.16.5 (Archive Manager 壓縮管理員)

前置作業

執行下面指令,產生測試資料

cd /tmp
mkdir bb/cc/dd -p
touch bb/cc/dd/files
touch bb/cc/files

執行

$ tree bb/

顯示

bb/
└── cc
    ├── dd
    │   └── files
    └── files

2 directories, 2 files

測試一 (#2)

打包壓縮

執行

$ tar cvzf aa.1.tar.gz -C bb/cc .

顯示

./
./files
./dd/
./dd/files

觀看檔案列表 (使用 tar)

執行

$ tar tzf aa.1.tar.gz

或是執行

$ tar tf aa.1.tar.gz

顯示

./
./files
./dd/
./dd/files

觀看檔案列表 (使用 vim)

執行

$ vim aa.1.tar.gz

顯示

" tar.vim version v29
" Browsing tarfile /tmp/aa.1.tar.gz
" Select a file with cursor and press ENTER

./
./files
./dd/
./dd/files

觀看檔案列表 (使用 file-roller)

執行 (或是在「thunar」或「nautilus」直接點選該檔案)

$ file-roller aa.1.tar.gz

會跳出視窗

一開始顯示資料夾「.」,點選資料夾「.」,會顯示資料夾「dd」和檔案「files」

點選資料夾「dd」,就會看到「Location:」那的值是「/./dd/」

測試二 (樓主想要知道的使用方式)

打包壓縮

執行

$ tar cvzf aa.2.tar.gz -C bb/cc files dd

或是執行

$ tar cvzf aa.2.tar.gz -C bb/cc $(ls bb/cc)

顯示

files
dd/
dd/files

註:

  • 「-C bb/cc」 表示 切換到「bb/cc」這個資料夾
  • 「files dd」 表示 要壓縮的檔案列表,所以可以改用「$(ls bb/cc)」來置換。也就是「man tar」的「SYNOPSIS」那,最後的 [pathname …]

觀看檔案列表 (使用 tar)

執行

$ tar tzf aa.2.tar.gz

或是執行

$ tar tf aa.2.tar.gz

顯示

files
dd/
dd/files

觀看檔案列表 (使用 vim)

執行

$ vim aa.2.tar.gz

顯示

" tar.vim version v29
" Browsing tarfile /tmp/aa.2.tar.gz
" Select a file with cursor and press ENTER

files
dd/
dd/files

觀看檔案列表 (使用 file-roller)

執行 (或是在「thunar」或「nautilus」直接點選該檔案)

$ file-roller aa.2.tar.gz

會跳出視窗

一開始顯示,是資料夾「dd」和檔案「files」,

點選資料夾「dd」,就會看到「Location:」那的值是「/dd/」

測試三 (樓主提到的使用 Archive Manager 也就是 file-roller的方式)

打包壓縮

使用「nautilus」或是「thunar」其中之一,

切換到「/tmp/bb/cc/」這個路徑,然後「Ctrl+a」全選,也就是會選到『資料夾「dd」和檔案「files」』。

然後按下右鍵,會出現「功能選單」

「nautilus」選「Compress…」

「thunar」選「Create Archive…」

然後開啟「Terminal」

執行

$ ps aux | grep file-roller

顯示

user      22257  2.2  0.6 627968 39172 ?        Sl   13:08   0:00 file-roller --default-dir=/tmp/bb/cc --add /tmp/bb/cc/dd /tmp/bb/cc/files

從上面的資訊,可以直接執行下面指令

$ file-roller --default-dir=/tmp/bb/cc --add /tmp/bb/cc/dd /tmp/bb/cc/files

也會跳出視窗,

按下「Create」按鈕,就會產生「/tmp/bb/cc/cc.tar.gz」這個檔案

切換資料夾

執行

$ cd /tmp/bb/cc/

觀看檔案列表 (使用 tar)

執行

$ tar tzf cc.tar.gz

或是執行

$ tar tf cc.tar.gz

顯示

files
dd/
dd/files

觀看檔案列表 (使用 vim)

執行

$ vim cc.tar.gz

顯示

" tar.vim version v29
" Browsing tarfile /tmp/bb/cc/cc.tar.gz
" Select a file with cursor and press ENTER

files
dd/
dd/files

觀看檔案列表 (使用 file-roller)

執行 (或是在「thunar」或「nautilus」直接點選該檔案)

$ file-roller cc.tar.gz

會跳出視窗

一開始顯示,是資料夾「dd」和檔案「files」,

點選資料夾「dd」,就會看到「Location:」那的值是「/dd/」

探索「Source Package」

下載「Source Package」

執行下面指令,下載「file-roller」的「Source Package

$ apt-get source file-roller

觀看「file-roller-3.16.5」資料夾結構

執行

$ tree file-roller-3.16.5

觀看「README_COMMANDLINE」內容

執行

$ less file-roller-3.16.5/README_COMMANDLINE

README_COMMANDLINE」這個檔的內容,有說明上面「file-roller」下指令的用法。

另外也可以執行「$ man file-roller」對照著看。

列出「src/fr-command*.c」

在「file-roller-3.16.5/src/」有很多「fr-command」開頭命名的檔案

執行

$ ls file-roller-3.16.5/src/fr-command*.c -1

顯示

file-roller-3.16.5/src/fr-command-7z.c
file-roller-3.16.5/src/fr-command-ace.c
file-roller-3.16.5/src/fr-command-alz.c
file-roller-3.16.5/src/fr-command-ar.c
file-roller-3.16.5/src/fr-command-arj.c
file-roller-3.16.5/src/fr-command.c
file-roller-3.16.5/src/fr-command-cfile.c
file-roller-3.16.5/src/fr-command-cpio.c
file-roller-3.16.5/src/fr-command-dpkg.c
file-roller-3.16.5/src/fr-command-iso.c
file-roller-3.16.5/src/fr-command-jar.c
file-roller-3.16.5/src/fr-command-lha.c
file-roller-3.16.5/src/fr-command-lrzip.c
file-roller-3.16.5/src/fr-command-rar.c
file-roller-3.16.5/src/fr-command-rpm.c
file-roller-3.16.5/src/fr-command-tar.c
file-roller-3.16.5/src/fr-command-unarchiver.c
file-roller-3.16.5/src/fr-command-unsquashfs.c
file-roller-3.16.5/src/fr-command-unstuff.c
file-roller-3.16.5/src/fr-command-zip.c
file-roller-3.16.5/src/fr-command-zoo.c

觀看「src/fr-command-tar.c」

執行下面指令,觀看「src/fr-command-tar.c」這個檔案的內容

$ less file-roller-3.16.5/src/fr-command-tar.c

大略瀏覽這個檔案的內容,大概可以了解到「file-roller」不是透過呼叫lib,是透過呼叫外部指令,

也就是呼叫「tar」這個指令來執行相關的功能的。

可以看到裡面也有使用到「tar」的「-C」這個選項,相關的程式碼

其他檔案

編譯前置作業

執行下面指令,安裝編譯時,需要的套件

$ sudo apt-get build-dep file-roller

GTK+ 3 Reference Manual

以上參考

:-)