
我正在嘗試歸檔一個包含隱藏文件和資料夾的項目資料夾,我得到一個根條目為.
.它很煩人。通常 :
tar -czf $ARCHIVE_NAME -C $DIR .
將建立一個存檔,例如
./package.json
./.git
./.gitignore
.
.
.
我希望存檔的根目錄是實際的文件和資料夾,而不是條目.
。喜歡
package.json
.git
.gitignore
.
.
.
我怎麼做?
* 編輯 *
下圖可能有助於澄清這個問題。
- 左側是使用專案的 GUI 工具建立的存檔(兩天前)。
- 右側是使用上述
tar
指令建立的存檔。
注意“位置”欄;右側的檔案應該是/
,並且不是 /./
。
答案1
./
表示目前目錄。您的兩個清單是相同的。
列出存檔時放在./
文件前面有助於處理具有特殊名稱的文件。檔案名稱將-file
顯示為./-file
允許由第二個工具處理。
答案2
更改您的命令
tar -czf $ARCHIVE_NAME -C $DIR .
到
tar -czf $ARCHIVE_NAME -C $DIR ./*
應該可以解決問題。這樣,您就不會說“將目錄新增.
至檔案”,而是說“將目錄中的所有這些檔案新增.
至檔案”。
答案3
此命令將 tar 目前目錄中的文件,不含前導./
:
tar cf /some/tarfile.tar *
當然,它不會包含以句點開頭的檔案名,這可能不是您想要的。您可以添加額外的通配符來捕獲這些:
tar cf /some/tarfile.tar * .[a-zA-Z]*
但這不是一個通用的解決方案;您必須知道目錄中的檔案名,以便可以製作適當的通配符。
GNU tar——大多數 Linux 發行版使用的——具有使用表達式轉換檔名的功能sed
。這將./
在建立存檔時從文件中刪除:
tar cf /some/tarfile.tar --transform 's,^\./,,' .
產生的存檔中仍將有一個“.”條目。目錄本身。
某些版本tar
可以從檔案中讀取要壓縮的檔案的名稱。您可以利用該功能來執行此操作:
ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin
此管道建立當前目錄中所有文件的列表,刪除.
和..
條目,並將其餘名稱通過管道傳輸到tar
. tar 使存檔從檔案名稱讀取/dev/stdin
(其標準輸入)。