使用標準輸入中的文件列表呼叫 tar 的攜帶式方法
我想從目錄的內容創建一個 .tgz 。我還想
./
從 tar’ed 內容中刪除前導 " “。我這樣做如下:
cd /path/to/files/ && find . -type f | cut -c 3- | xargs czf /path/to/tgz/myTgz.tgz
我最近了解到 using
xargs
可能不是解決此問題的最佳方法,因為如果 cmdline arg 列表太長,xargs
可能會呼叫tar
多次,並且建議我使用tar
’ 從 stdin 讀取輸入文件列表的能力。我最終找到了這篇關於如何做到這一點的文章。但是,我發現建議…cd /path/to/files/ && find . -type f | cut -c 3- | tar czf foo.tgz -T -
…似乎不便攜。它在我的開發 PC 上執行良好,但在 busybox 目標上,執行相同的命令時出現以下錯誤:
tar: can't open '-': No such file or directory
所以,我的問題:是否有一種真正可移植/全域的方式來呼叫通過從標準輸入(而不是 cmdline 參數)提供輸入文件
tar
來創建一個?.tgz
(我無法選擇安裝/ /etc
tar
等替代品。)gnutar``bsdtar
(第二個問題:為什麼“
-T -
”參數tar
表示“從”讀取文件stdin
?從tar
手冊頁中,我只能找到“-T
”的意思:獲取名稱以從 FILE 中提取或創建
…但我看不到任何對普通“
-
”的引用)
通常的約定
-
是在需要輸入文件名的地方解釋為標準輸入,在需要輸出文件名的地方解釋為標準輸出。因為這是一個通用約定,所以 GNU tar 手冊頁中的簡短幫助摘要沒有提及它,但完整的手冊(通常通過 本地提供info tar
)會提及。POSIX 命令行實用程序語法指南包含此約定,因此它非常普遍(但它始終是程序作者的選擇)。BusyBox 實用程序確實遵循此約定。但是手冊沒有提到
tar
支持 option-T
,我發布的機器上的版本也沒有(Ubuntu 上的 1.27.2)。我不知道您為什麼會收到錯誤“:沒有這樣的文件或目錄”而不是“無效的選項 - ‘T’”。您似乎將其tar
解釋-T
為不帶參數的選項,然後將-
其視為文件名。由於在這種情況下 tar 需要一個文件名來放入存檔,而不僅僅是來自文件的一些內容-
,因此對.BusyBox 實用程序在設計上支持一組受限的功能,因為它們適用於 GNU 實用程序的更高級功能不適合的嵌入式系統。顯然
-T
不是 BusyBox 設計者認為有用的功能。我認為 BusyBox tar 沒有任何方法可以從標準輸入讀取文件名。如果您需要歸檔目錄中的文件子集並且不需要歸檔中的任何符號連結,則一種解決方法是在臨時目錄中創建符號連結林並將此臨時目錄歸檔。
目前尚不清楚您使用
find
. 如果您只想要目前目錄中的文件,為什麼不tar czf /path/to/archive.tgz -- *
呢?如果存在子目錄並且您想要歸檔這些子目錄中的文件,而不是目錄本身,則您的命令確實有意義(可能是要將它們恢復到目錄結構必須存在但可能具有不同權限的地方)。在這種情況下,領先./
不會造成任何傷害。