Directory

–strip-components -C 在 tar 中是什麼意思?

  • March 29, 2020

我想確保我理解以下程式碼:

tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION

已在此答案中發布。

來自man tar

--strip-components=NUMBER

提取時從文件名中去除 NUMBER 個前導組件

-C,--directory=DIR

切換到目錄 DIR

我不明白--strip-components.

關於-C,我理解它的意思是“將剝離的組件放在指定的目錄中”。

是什麼--strip-components -C意思?

您在問題中包含的手冊頁片段來自 man for GNU tar。GNU 是一個軟體項目,它更喜歡資訊手冊而不是手冊頁。事實上,tar 手冊頁僅在 2014 年才被添加到 GNU tar 原始碼樹中 ,它仍然只是一個參考,而不是帶有範例的完整手冊。您可以使用 呼叫完整的資訊手冊info tar,也可以 在此處線上獲取。它包含幾個--strip-components使用範例,相關片段是:

--strip-components=number

在提取之前從文件名中去除給定數量的前導組件。

例如,如果歸檔“archive.tar”包含“some/file/name”,則執行

tar --extract --file archive.tar --strip-components=2

會將這個文件提取到文件“name”中。

和:

--strip-components=number

在提取之前從文件名中去除給定數量的前導組件。

例如,假設您已將整個 /usr' 層次結構歸檔到一個名為 usr.tar’ 的 tar 歸檔文件中。在其他文件中,此存檔包含您希望提取到目前工作目錄的“usr/include/stdlib.h”。為此,請鍵入:

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

選項 --strip=2' 指示 tar 從文件名中去除兩個前導部分(usr/’ 和 `include/’)。


那就是說;

還有其他的 tar 實現,例如FreeBSD tar 手冊頁對此命令有不同的解釋:

--strip-components count

刪除指定數量的前導路徑元素。元素較少的路徑名將被靜默跳過。請注意,在檢查包含/排除模式之後但在安全檢查之前編輯路徑名。

換句話說,您應該將 Unix 路徑理解為由/(除非只有一個/)分隔的元素序列。

這是我自己的範例(我在上面連結到的資訊手冊中提供了其他範例):

讓我們創建一個新的目錄結構:

mkdir -p a/b/c

路徑a/b/c由 3 個元素組成:abc

在此目錄中創建一個空文件並將其放入 .tar 存檔:

$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE

FILEa/b/c/FILE路徑的第四個元素。

列出archive.tar 的內容:

$ tar tf archive.tar
a/b/c/FILE

您現在可以提取 archive.tar和一個參數,該參數將告訴它在提取時--strip-components要刪除多少個路徑元素。a/b/c/FILE刪除原始a目錄:

rm -r a

提取--strip-components=1- onlya尚未重新創建:

$ tar xf archive.tar --strip-components=1
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 3 ja users  4096 Mar 26 15:43 b
$ tree b
b
└── c
   └── FILE

1 directory, 1 file

--strip-components=2會看到a/b- 2 個元素尚未重新創建:

$ rm -r b
$ tar xf archive.tar --strip-components=2
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 2 ja users  4096 Mar 26 15:46 c
$ tree c
c
└── FILE

0 directories, 1 file

沒有重新創建--strip-components=33 個元素,我們進入了我們執行的同一級別目錄:a/b/c``FILE``tar

$ rm -r c
$ tar xf archive.tar --strip-components=3
$ ls -Al
total 12
-rw-r--r-- 1 ja users     0 Mar 26 15:39 FILE
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar

-C選項告訴 tar 在執行請求的操作之前更改到給定目錄,提取但也存檔。在此評論中 ,您問:

讓 tar 做 cd:為什麼要 cd?我的意思是問,為什麼不只是mv?

為什麼你認為這樣mv更好?您想先將 tar 存檔解壓縮到哪個目錄:

  • /tmp - 如果它失去或已滿怎麼辦?
  • “$TMPDIR” - 如果它未設置、失去或已滿怎麼辦?
  • 目前目錄 - 如果使用者沒有w權限,只是rx
  • 如果一個臨時目錄,無論它已經包含與tar存檔和提取中同名的文件,都會覆蓋它們怎麼辦?
  • 如果一個臨時目錄,不管它是什麼不支持 Unix 文件系統,以及有關所有權、可執行位等的所有資訊都會失去怎麼辦?

另請注意,這也是其他程序中-C的常見選項,我首先想到的是Gitmake 。change directory

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