我剛剛了解到cpio有三種模式:copy-out、copy-in和pass-through。
我想知道 cpio 在複製輸出和複製輸入模式下相對於 tar 的優點和缺點是什麼。什麼時候使用 cpio 比較好,什麼時候使用 tar 比較好?
直通模式下的 cpio 與 cp 的類似問題。
感謝致敬!
答案1
這是一個非常籠統的概述:
CPIO 在複製檔案系統方面做得更好,包括備份。它保留了硬連結、fifo 和其他非標準檔案功能。 CPIO 的大多數實作都執行 TAR 執行的所有操作,包括讀取和寫入 .tar 檔案。 CPIO 通常會從標準輸入取得檔案清單以進行歸檔;這使得從其他東西(例如)透過管道傳輸清單變得非常容易find
。
如果您想要從目錄 A 複製到目錄 B 的檔案清單很長,則 CPIO 直通非常有用find
。
TAR 做得更好,只需將所有標準檔案轉儲到磁帶(或存檔檔案)或從磁帶(或存檔檔案)轉儲即可。使用起來更簡單(對於大多數常見任務)。輕鬆滿足大多數人簡單的備份需求;而它的受歡迎大部分就是源自於這個事實。
現在是細則。 CPIO 和 TAR 有多個不同的版本和實作。每一種都有不同的功能,有些有不同的命令列選項。有些事情彼此可以做,對方則不能;如果您發現自己受到其中一種限制,請嘗試另一種。每個人都有自己最喜歡的,在 99% 的情況下,其中一個都能完成任務。
答案2
在 AE 3 redhat 上,我發現 cpio 對輸出流的大小限制為 2 GB。然而,tar 沒有這個限制。
其他系統可能有不同的限制。
答案3
我從評論和其他背景中了解到,cpio
現在不太普遍並且版本之間不一致。但cpio
我最近發現,在處理大量損壞的 tar 檔案時,有一個優點非常寶貴。它不會在 tar 檔案中出現第一個錯誤時停止,而是嘗試跳過錯誤資料並盡可能提取資料。例如,
tar xf ./sample.corrupt.tar
將列印
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
在第一次遇到錯誤之後,而
cpio -F ./sample.corrupt.tar -i -v
將列印提取的文件,並且對於每個錯誤將列印:
cpio: invalid header: checksum error
cpio: warning: skipped 6 bytes of junk
cpio: invalid header: checksum error
cpio: warning: skipped 2 bytes of junk
etc...
tar 格式期望每個存檔標頭在 512 邊界上對齊,但如果損壞導致標頭未對齊,cpio
請盡最大努力提取盡可能多的內容
答案4
我認為除了翻錄打開的 RPM 檔案之外,沒有任何理由使用 cpio,透過解調或者rpm2cpio,但可能存在 cpio 優於 tar 的極端情況。
歷史和受歡迎程度
兩個都柏油和CPIO是引進的競爭存檔格式版本 7 Unix1979年,然後納入POSIX.1-1988,儘管下一個標準 POSIX.1-2001 中僅保留 tar1。
cpio 的檔案格式已更改多次,且版本之間並未保持完全相容。例如,現在有二進位檔案資訊資料的 ASCII 編碼表示。
Tar 更廣為人知,多年來變得更加通用,並且更有可能在給定係統上得到支援。 CPIO 仍在少數領域使用,例如紅帽包格式 (RPM),不過轉速 v5(這確實是晦澀難懂的)使用西拉而不是 cpio。
兩者都存在於大多數類 Unix 系統上,儘管 tar 更常見。這裡有Debian 的安裝統計:
#rank name inst vote old recent no-files (maintainer)
13 tar 189206 172133 3707 13298 68 (Bdale Garbee)
61 cpio 189028 71664 96346 20920 98 (Anibal Monsalve Salazar)
模式
複印輸出:這用於存檔創建,類似於tar -pc
抄入:這是用於存檔提取,類似於tar -px
直通:這基本上是上述兩者,類似於tar -pc … |tar -px
但在單一命令中(因此微觀上更快)。它與 類似cp -pdr
,儘管 cpio 和(尤其是)tar 都具有更多的可自訂性。也要考慮rsync -a
人們經常忘記的,因為它更通常透過網路連線使用。
我沒有比較它們的性能,但我預計它們在 CPU、記憶體和存檔大小(壓縮後)方面將非常相似。