cpio

cpio:copy file to and from archives 複製文件到歸檔文件中,從歸檔文件中複製文件

描述:來自man文檔

GNU cpio是一個這樣的工具:創建和提取歸檔文件,將文件從一個地方拷貝到另一個地方。它可以處理一些cpio格式的文件,也可以讀寫tar格式文件。

cpio支持的歸檔文件格式有:binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar。tar格式是爲了兼容tar程序(Linux中的歸檔程序)。cpio默認會創建binary格式的歸檔文件,這是爲了兼容老版本的cpio程序。當從歸檔文件中提取文件時,cpio會自動識別生在讀取的是哪一種歸檔格式的文件,還可以讀取在與本機字節順序不同的機器上創建的歸檔文件。

模式

cpio 有三種模式:

1.copy-out 模式

在copy-out模式中,cpio拷貝文件進而創建歸檔。它從標準輸入中讀取以一個名字佔一行的格式列出的文件名列表,而後將創建的歸檔內容打印到標準輸出上。一個典型的生成文件名列表的方式是用find命令,在find命令中你可以用-depth選項來最小化在不可達目錄上的權限問題。

使用方法:

1)能列出文件列表到標準輸出的cmd(ls,find) | cpio -o [options] [> file]

2)cpio -o [options] < namelist.file [>file]

無論是|還是namelist,cpio -o 都要接受來自標準輸入的輸入

[options]

-o/--create 進入copy-out模式

-0  將來自標準輸入的文件名列表的分隔符設置爲null,替換默認的換行符。這樣就可以歸檔那些文件名包含換行符的文件名了。

這個選項可以用在copy-out和copy-pass模式中

-A  將此次生成的歸檔追加到一個已經存在的歸檔中

-c  等價於-H newc 使用new SVR4 可移植格式 可以用在copy-out和copy-in中使用

-H FORMAT 使用歸檔的格式 可以用在copy-out和copy-in中使用

支持的常見格式:

bin 淘汰的二進制格式

odc 老的(POSIX.1版本)可移植格式

newc new SVR4 可移植格式,支持擁有多於65536個inode的文件系統

tar 老的tar格式

ustar POSIX.1版本的tar格式。也識別GNU tar歸檔文件,它們很類似,但不相同 

-v 列出被處理的文件 三種模式均可用

e.g.: ls|cpio -ov > file

Attention:cpio -o  是接受來自標準輸入,並將其視爲文件列表,因此在這個列表中沒有的文件,自然就不會被歸檔,例如,子目錄下的文件。穩妥的辦法是使用find的命令來生成文件列表,這樣比較齊全,隱藏文件,整個目錄結構上的文件列表都會被列出來。這樣再使用cpio 進行歸檔,就很方便,不會遺漏了。

e.g.

find ~/ print | cpio -ov > file

find . | cpio -o -H newc | gzip -9 > /boot/initrd-2.6.22.1.img 製作內核文件

2.copy-in 模式

在copy-in模式中,cpio從歸檔中拷貝出文件,或者列出歸檔的內容。它從標準輸入中讀取歸檔。任何非cpio選項的命令行參數都是shell的通配模式。只有匹配那個模式的文件名,cpio纔會從歸檔中將文件拷出。與在shell中不同,在文件名起始處的.不能匹配模式開始處的通配符,文件名中的/可以匹配通配符。如果不指定模式,那麼所有文件都會被提取。

使用方法:

1)cpio -i [options] [pattern] < archive.file

2)能輸出archive內容到標準輸出的cmd(例如rpm2cpio) | cpio -i [options] [pattern]

無論哪種方法,cpio從標準輸入接受的必須是歸檔文件纔會有正確的輸出

-i 進入copy-in模式

-d 在需要的地方創建與輸入文件相同的目錄結構,還原時自動生成目錄,copy-in和copy-pass可用

-c 參見copy-out

-H FOMAT 參見copy-out

-v 參見copy-out

-t 打印輸入內容的表格,就是預覽,只有copy-in有效

pattern 非cpio選項內容的通配符,可以達到只解檔或顯示某個或某些文件的效果

e.g.cpio -it <1.cpio 預覽

cpio -iv <1.cpio 完全解檔,某些情況下加不加-d都可以創建完整的目錄結構,但一般都加會比較好

假若只解檔其中的某個文件

cpio -iv */f1 < 1.cpio 如果f1在一個目錄下,而這個目錄不存在,就會解檔失敗,因此這是需要-d

cpio -idv */f1 <1.cpio

上述例子說明了pattern的用法,建議匹配某個目錄下的f1用*/f1,而非*f1,後者貌似不能正常工作,還可以支持複雜的pattern

e.g.cpio -idv */dir3/*[1-4] < ../1.cpio 

   

   此外我們還可以查看一個rpm包中包含的內容,甚至可選地解檔出某個文件

   rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -idv 解檔整個rpm包

   rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -idv */tree.1* 解檔某個文件

   

   

3.copy-pass 模式

 在copy-pass模式中,cpio將文件從一個目錄樹拷貝到另一個目錄樹下,這個模式結合copy-out和copy-in的步驟卻實際上沒有使用歸檔。它讀取來自標準輸入的文件列表,將其拷貝到指定目錄當中,這個目錄是以非cpio選項的參數的形式來指定

 使用方法:是copy-out和copy-in的綜合,沒有中間生成arhive步驟了

 1)能列出文件列表到標準輸出的cmd(ls,find) | cpio -o [options] dest_dir

 2)cpio -o [options] dest_dir <namelist

 無論是|還是namelist,cpio -p 都要接受來自標準輸入的輸入,這跟copy -o一致,也充分說明了copy -o 是它處理步驟的一部分

      -p 進入copy-pass模式

-0 參見copy-out

-v 參見copy-out

-d 在需要的地方創建與輸入文件相同的目錄結構 參見copy-in

e.g.find test | cpio -pdv ~/d1

這裏不使用ls的原因在於,cpio -p將來自標準輸入的輸入視爲文件名,這樣來進行復制的,ls只會打印目錄下的一級目錄,因此,使用ls作爲cpio -p的輸入時,複製會不完整,而且也缺失了隱藏文件。使用find 比較穩妥

find test print > namelist2

cpio -pdv ~/d2 < namelist2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章