- 论坛徽章:
- 0
|
系統管理
Unix系統基本的備份與回復工具—dump及restore
劉琍綾
前言
標準的 UNIX 系統皆有提供基本的備份工具, 這些工具在某種程
度上可說是無趣的, 它們的功能並不特別花俏且有許多限制,有些
至今仍有小錯誤(如, 某些 UNIX 版本終於將 dump 中”倒帶
tape-rewinding ”的錯誤加以更正)。
然而這些基本備份工具中, 仍有些功能尚未被商業備份廠家吸收
採用,因此這些功能會長久存在且不用額外花錢購買。 它們在任何
平台環境的運作方式大致相同,如有差異也只有少許的不一樣。 無
論您是否剛接觸備份世界, 或是經驗豐富的系統管理者,都必須熟
悉這些工具。
Dump, cpio,tar與dd之運用時機
不同備份工具之間有不同的差異與優缺點。 Dump 及 restore 通
常是最好的選擇,其次是 cpio, 但它比 tar 來得不親和些; tar
則比 dump 或 cpio 更容易使用且更具攜帶性。 如果希望使用 tar
或 cpio 備份 raw devices 或執行遠端備份,那麼 dd 可以是您的
另一項選擇。
dump及restore工具
如果您正在負責備份至少一個以上的 UNIX 伺服器, 但經濟上無
法負擔商用備份產品, 也不信任免費的公共軟體來備份重要資料,
那麼最好您的 UNIX 版本有提供 dump 及 restore 指令,它們在備
份及回復整個系統上非常具有彈性與變化。 dump 及 restore 是相
當複雜的指令, 附有一簡單的介面及數個基本選項,這些選項在大
部份的 UNIX 系統是相同的。 有些 UNIX 版本改變了 dump 的名字
或部份特性,但這些改變都是非常小的。dump 也出現在仿 UNIX 系
統中,如:Linux 及 Network Appliance 系統。在未來您可能並不
打算使用 dump 來備份資料, 但是您卻會有機會從某處的 dump 資
料卷中讀取內容, 屆時,本文將帶給您相當的幫助。
cpio備份工具
如果沒有 dump 指令或者 dump 版本不符所需, 則 cpio 是您的
下一個好選擇。cpio 比其它備份工具存在的時間久,且具有一些其
它工具所缺乏的重要特性。 但首先需說明的是,有些功能 dump 有
提供而 cpio 則無者,如下:
‧無需使用touch或find檔案,即可執行變動備份(incremental backup
);
‧備份完後不改變資料的atime及ctime;
‧以互動方式執行資料回復,如restore的選項-i。
cpio 是一個非常有用的備份工具,它最大的不同處,是可以備份
從標準輸入( stdin )而來的的檔案。 目前有些新版的 tar 支援
從標準輸入來的檔案備份,但大部份尚未有此功能。
為什麼cpio較不常被使用?
如果 cpio 如此好用,為何 tar 卻比較風行?最可能的理由是同
樣的功能,tar 比 cpio 較簡單易用(也較標準)。 例如:每個版
本的 tar 都支援 tar cf device 及 tar xf device, 然而 cpio
有時支援 I 及 O;有的版本則無。如果將 cpio 每種版本的選項累
計,則有近 40 個選項, 甚至有些使用同一字母的參數,在不同版
本的 Unix 有不同的意義。 但您只要使用在大部份平台皆標準的選
項,那麼,cpio 幾乎與 tar 一般簡單好用。
tar備份工具
如果需要定期備份整個作業系統,dump 可能是最好的選擇。其次
是 cpio, 因為它可與 find 搭配執行變動備份( incremental
backup )。如果您像大部份的人一般,只為了將資料做一次完整的
備份,那麼就不需要定期或變動備份等功能。 例如,您可能希望快
速地備份使用者 /home 目錄。您可能想要刪除使用者的一大群目錄
與檔案, 但唯一可讓使用者接受的備份方式,是將其資料全部寫入
磁帶或光碟內儲存並交給他。 因此您不在乎 atime,不需定期做變
動備份, 只希望將一堆資料放到備份媒體上,而且也希望他人可以
很容易地將資料從備份中取出, 在這種情況下,tar 會是個最佳選
擇。
有一些功能是 cpio 有而大部份的 tar 則無的( GNU tar 沒有
這些限制),例如:
‧可以備份來自stdin的檔案;
‧當備份完成時重新設定檔案的atime,儘管這會改變其ctime。
雖然 tar 的歷史並不比 cpio 來得久,但它卻得到較大的接受度
,這也正是它的特點之一。幾乎每個人都知道如何讀 tar 檔,即使
不會也很容易學。 有些程式如 WinZip, 甚至可以自動地解開一個
tar 檔或壓縮過的 tar 檔以讀取其內容( WinZip 卻無法開啟
cpio 檔)。tar 也較 dump 或 cpio 在 Unix 平台間具可攜性。
dd工具
大部份的人不常使用 dd 來作備份, 它是一個相當低階的指令,
可將資訊內涵的每個位元( bit )原封不動地從一個地方搬到另一
個地方, 它不管也無需知道備份資料的結構。 因此不同於 dump,
tar, 及 cpio, 它不可以拷貝一群檔案至儲存媒體, 只可以拷貝一
個檔案或一檔案的部份或 partition 或部份 partition,甚至可以
在資料修改中途將資料從標準輸入( stdin )拷貝至標準輸出(
stdout )。即使 dd 可以拷貝單一檔案,但其對檔名或檔案內容是
一無所知的, 它純粹只是從一個地方搬運檔案的位元內容至另一個
地方而已。
這種方式看似相當簡單, 相對地它也相當有彈性,可以在不考慮
資料格式之下執行拷貝動作, 因此它可在兩個不同平台間作資料轉
換。 例如:從 EBCDIC 到 ASCII,或 Oracle 允許資料以檔案系統
下的檔案形式存在, 亦可以直接放在原始磁碟區塊上,然而備份程
式無法預測資料庫管理師會以何種方式存放資料, 故採用富彈性的
dd 作自動備份,甚至備份結果是混合此兩種資料形式也無妨,亦即
有些在檔案系統中,有些則在原始磁碟上。 如此,資料管理師可依
資料應用特性決定其存放形式,可見 dd 所提供的彈性助益甚大。
其它備份工具
尚有其它較不為人知或只出現在某些平台的備份工具, 其中較常
使用的包括:
‧pax:pax是Portable Archive eXchange的縮寫,可產生一可攜式的備
份, 此備份格式符合 IEEE Std.1003.1-1988 的
Archive/Interchange File Format。 pax 亦可讀寫一些其它的
檔案格式如 tar 或 cpio。 正如 Unix 世界的許多現象般,pax
也有一群擁護者認為它是備份工具中最好的選擇。
‧fbackup:fbackup只有HP-UX提供且屬於HP的System Administration
Menu ( SAM )的工具之一,使用 fbackup 作的備份, 只
能在另一個 HP-UX 主機上使用 frecover 讀取之。 僅管
fbackup 比傳統的 tar 及 cpio 有較多的功能, 但它缺乏
可攜性的缺點是非常使人詬病的。 即使您無法用 SAM 來操
作 dump, cpio 或 tar,但這三個指令的可攜帶特性,絕對
值得您花較多的心力去使用它們。
使用dump備份資料
對許多系統環境而言,dump 是一確保備份品質的好工具。為使用
dump 及 restore 作定期系統備份,必須先了解下面事項:
‧如何使用dump備份檔案系統;
‧如何備份至儲存媒體上;
‧如何從一dump檔讀取其內的資料目錄;
‧如何處理dump檔並從dump檔中將資料回復。
dump指令的語法
先從dump的基本指令開始:
# dump levelunbdsf blkg-factor density size device-name
file_system
下面是執行此指令的例子:
.對/home做一完整備份至本地磁帶機/dev/rmt/0cbn:
# dump 0unbdsf 126 141000 11500 /dev/rmt/0cbn /home
‧對/home做一完整備份至光碟機/backup/home.dump:
# dump 0unbdsf 126 141000 11500 /backup/home.dump /home
‧對/home做一完整備份至遠端主機hsm的磁帶機/dev/rmt/0cbn:
# (r)dump 0unbdsf 126 141000 11500 hsm:/dev/rmt/0cbn /home
上述的指令包含不需要參數的三個選項( 0,u, 及 n ),及需要
參數的四個選項( b,d,s 及 f )。
dump 指令的第一個參數是一串選項,然後每個選項對應的參數依
照選項的順序依次放置於指令行,參見圖一。
dump指令的選項
在大部分的平台上,dump有七個主要的選項:
0 -9:標示dump應執行的備份階層。
b:標示dump應使用的區塊數目因子。
u:告訴dump須更新dumpdates檔案。
n:告訴dump,當完成dump動作時通知操作者及與其同一組(group)的
人。
D 及 s:告訴dump備份的資料量多大,dump利用這些數字預估需要多少
”磁帶”。
f:告訴dump使用何種儲存設備。
W, w:此選項幾乎很少用到,它告訴dump執行假備份以判斷有那些檔案
系統必須備份。
如果欲使用 dump 定期執行系統備份,那麼, 您應會用到上述大
部份的選項。 這些選項有預設值,如無特別要求,可不用特別標明
dump 選項及其參數,例如:預設的備份階層通常是 9。預設值的問
題是它們會因不同的作業系統而不同, 甚至同一個作業系統也會因
儲存媒體的不同而有差異。 最好的方式是在所有的 dump 備份都標
明相同的選項,有助於資料回復的容易度。
使用resotore工具回復資料
您必須相當熟悉以不同的方式使用 restore 指令,從 dump 產生
的備份中取得資料。
含備份資料的儲存媒體可讀否?
為確保你知道備份磁帶的格式與區塊數目大小, 先嘗試列出它的
目錄。 下列指令可產生 dump 備份磁帶的目錄: $ restore tbfy
block_size device-name
例如,從一個在 /dev/rmt/0cbn 磁帶設備上的 dump 磁帶(使用
的區塊因子是 32 )讀取其目錄,指令如下:
$ restore tbfy 32 /dev/rmt/0cbn
restore指令的語法
一旦可以讀取 dump 磁帶, 您必須決定要讀什麼資料及如何讀它
,以下討論 restore 一般常用的參數。
基本上,有四件事情是你希望dump磁帶提供的:
‧讀取dump磁帶的目錄以確認內容是否需要;
‧回復整個檔案系統;
‧回復選定的檔案;
‧執行互動式的回復。
一般restore指令語法如下:
restore [trxi]vbsfy blocking-factor file-number device-name
restore指令的選項
restore 的行為如何,端視其後的參數型態決定回復的形式。 第
一個參數指明 restore 的型式,只可以從四種可能的參數中挑選一
種:
t:告訴restore顯示備份磁帶的目錄。
r:指明備份磁帶的整卷內容回復到目前的工作目錄之下。
x:只回復restore指令行末端所列的檔案。
i:以互動方式回復資料。
決定回復的行為
下面的參數不是必須的,但會影響回復的行為:
v:指定以明細(verbose)的方式輸出。
s:在開始讀磁帶前需跳過一些磁帶上的檔案。
b:指定正要讀取磁帶的區塊因子。
f:標明正使用的備份設備之檔名。
y:告訴restore嘗試從讀取錯誤中救回。
系统备份命令 cpio
另外一个复杂的备份命令,
cpio命令有三种模式:
copy-out 将系统的文件生成一个cpio格式的包
copy-in 将一个cpio格式的包解开
copy-pass 相当于一个cp命令,不进行任何的压包和解包的工作,经常用来复
制文件分别对应的参数是-o,-i,,-p这样记忆就比较方便了,linux命令的参数虽然很
多,但是还是有规律可以寻找的。
创建:
原始形态:
[root@laptop tmp]# cpio -o -O photo.cpio
按回车以后要手工输入你所需要打包的文件名。以Ctrl+D组合键结束。
[root@laptop tmp]# ls
Dcp_0803.jpg Dcp_0810.jpg Dcp_0815.jpg Dcp_0820.jpg Dcp_0827.jpg
Dcp_0804.jpg Dcp_0811.jpg Dcp_0816.jpg Dcp_0821.jpg Dcp_0828.jpg
Dcp_0805.jpg Dcp_0812.jpg Dcp_0817.jpg Dcp_0822.jpg
Dcp_0808.jpg Dcp_0813.jpg Dcp_0818.jpg Dcp_0825.jpg
Dcp_0809.jpg Dcp_0814.jpg Dcp_0819.jpg Dcp_0826.jpg
[root@laptop tmp]# ls | cpio -o > photo.cpio
cpio: Dcp_0803.jpg: truncating inode number
cpio: Dcp_0804.jpg: truncating inode number
cpio: Dcp_0805.jpg: truncating inode number
cpio: Dcp_0808.jpg: truncating inode number
cpio: Dcp_0809.jpg: truncating inode number
cpio: Dcp_0810.jpg: truncating inode number
cpio: Dcp_0811.jpg: truncating inode number
cpio: Dcp_0812.jpg: truncating inode number
cpio: Dcp_0813.jpg: truncating inode number
cpio: Dcp_0814.jpg: truncating inode number
cpio: Dcp_0815.jpg: truncating inode number
cpio: Dcp_0816.jpg: truncating inode number
cpio: Dcp_0817.jpg: truncating inode number
cpio: Dcp_0818.jpg: truncating inode number
cpio: Dcp_0819.jpg: truncating inode number
cpio: Dcp_0820.jpg: truncating inode number
cpio: Dcp_0821.jpg: truncating inode number
cpio: Dcp_0822.jpg: truncating inode number
cpio: Dcp_0825.jpg: truncating inode number
cpio: Dcp_0826.jpg: truncating inode number
cpio: Dcp_0827.jpg: truncating inode number
cpio: Dcp_0828.jpg: truncating inode number
2792 blocks
注:-o 参数也可义用 --create替代,表示正在使用copy-out模式,
-O 参数只能和-o一起使用,表示出于out模式时,指定生成的文件。
root@laptop tmp]# ls | cpio -o -O photo.cpio
这个命令,是等效的,只不过前者用重定向符号实现的而已。由此可以体现Linux命令
的复杂还有变化多样,所以要多思考。
查看,解包:
解包
[root@laptop tmp]# cpio -i -I photo.cpio
2792 blocks
注:-i 参数是表示使用copy-in模式
查看一个cpio包里的文件列表的参数和tar的参数有点相像,都是用-t参数,
也可以用--list替代。
-I 参数只和-t , -i 两个参数连用,表示在copy-in模式时指定一个cpio包。
有点像tar包里的-f参数,无论是打tar包还是解tar包或者是查看tar的内容
,都要加-f参数一样的道理,在这里,cpio只不过分成了copy-in和copy-out
两个部分而已。
[root@laptop tmp]# cpio -t -I photo.cpio
Dcp_0803.jpg
Dcp_0804.jpg
Dcp_0805.jpg
Dcp_0808.jpg
Dcp_0809.jpg
Dcp_0810.jpg
Dcp_0811.jpg
Dcp_0812.jpg
Dcp_0813.jpg
Dcp_0814.jpg
Dcp_0815.jpg
Dcp_0816.jpg
Dcp_0817.jpg
Dcp_0818.jpg
Dcp_0819.jpg
Dcp_0820.jpg
Dcp_0821.jpg
Dcp_0822.jpg
Dcp_0825.jpg
Dcp_0826.jpg
Dcp_0827.jpg
Dcp_0828.jpg
2792 blocks
查看一个cpio包里的文件列表的参数和tar的参数有点相像,都是用-t参数,这里可以
用--list替代。
还有一些高级的应用参数:
-u
解包时如果文件已经在也强行覆盖
[root@laptop tmp]# cpio -i -I test.cpio -u
[root@laptop tmp]# cpio -i -u -I test.cpio
-f
文件匹配参数,但是是一个反向的,就是符合这个指定的文件不解包
[root@laptop tmp]# cpio -i -I test.cpio -f *.rpm
这条命令的结果是test.cpio里除了*.rpm文件都会解包出来。
-L
这个参数是在打包的时候用的,如果被打包的文件中有符号连接的话,这个参数将会把连接的目标文件打入包中,而不是仅仅把符号连接打包。
[root@laptop tmp]# ls | cpio -o -O newtest.cpio -L
-R
这个参数只用在解包的时候,是用来给解包出来的文件设置所有者和所属组的。但是用户和组的关系必须已经在passwd,group两个文件中存在!!!
[root@laptop tmp]# cpio -i -I test.cpio -R yue.pye
[root@laptop tmp]# cpio -i -I test.cpio -R yueye
这里是两种表示用户组之间关系的方式一个是.还有一个是:
-r
这个参数只在解包是有用,而且不能和-u参数同时使用,否则失效,他的作用是当包中的文件和解包所在目录下的某个文件重名的时候自动提示是否需要更名。
[root@laptop tmp]# cpio -i -I test.cpio -r
rename 12.1 -> a
rename backgroud -> c
rename bin -> bindir
rename crystal ->
-A
这个参数只用在压包的时候,用来向已经存在的cpio包添加文件的
[root@laptop tmp]# cpio -o -O test.cpio -A
[root@laptop tmp]# cpio -o -A -O test.cpio
dump,tar,restore
呵呵,tar命令不但可以用来打包,还可以用来备份用的,:),但是要用来做以下操
作的话,打包的时候不能加上z(gzip压缩)参数。
[root@laptop pyegrp]# ls
enlightenment-0.16.5.tar.gz photo testdump yue.tar
gnomba-0.6.2-4.i386.rpm proftp yue
[root@laptop pyegrp]# tar cvf proftp.tar proftp/
proftp/
proftp/configuration.pdf
proftp/anonymous.conf
proftp/basic.conf
proftp/virtual.conf
proftp/abc
[root@laptop pyegrp]# tar rf proftp.tar testdump
[root@laptop pyegrp]# tar ft proftp.tar
proftp/
proftp/configuration.pdf
proftp/anonymous.conf
proftp/basic.conf
proftp/virtual.conf
proftp/abc
testdump
可以发现testdump已经被添加进去了
[root@laptop pyegrp]# tar Af proftp.tar yue.tar
可以将一个tar包和另一个合起来。
dump命令是一个专门用来备份的工具。
[root@laptop pyegrp]# dump -0 -u -f /dev/hda3 /home/pyegrp/
DUMP: Date of this level 0 dump: Sat Nov 30 19:45:56 2002
DUMP: Dumping /dev/hda9 (/home/pyegrp) to /dev/hda3
DUMP: Added inode 7 to exclude list (resize inode)
DUMP: Label: none
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 15492 tape blocks.
DUMP: Volume 1 started with block 1 at: Sat Nov 30 19:46:01 2002
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: Closing /dev/hda3
DUMP: Volume 1 completed at: Sat Nov 30 19:46:13 2002
DUMP: Volume 1 15490 tape blocks (15.13MB)
DUMP: Volume 1 took 0:00:12
DUMP: Volume 1 transfer rate: 1290 kB/s
DUMP: 15490 tape blocks (15.13MB) on 1 volume(s)
DUMP: finished in 12 seconds, throughput 1290 kBytes/sec
DUMP: Date of this level 0 dump: Sat Nov 30 19:45:56 2002
DUMP: Date this dump completed: Sat Nov 30 19:46:13 2002
DUMP: Average transfer rate: 1290 kB/s
DUMP: DUMP IS DONE
-0 是备份的等级,从0-9,0以后都是更新备份的参数,一般常用的是0和9
-u 是将备份记录写入/etc/dumpdates这个文件中
[root@laptop pyegrp]# cat /etc/dumpdates
/dev/hda9 0 Sat Nov 30 19:45:56 2002
/dev/hda9 9 Sat Nov 30 17:04:20 2002
注意,当你备份的目录是一个子目录,而不是一个分区的顶层目录时-u参数
是不能使用的。
-f 是指定备份到那个文件,也可以指定一个设备文件,我在这里指定的就是一个分区
更新备份:
在0级别备份的基础上,向/home/pyegrp写入一些新的文件,然后
umount /home/pyegrp
mount /home/pyegrp
注意如果不这样做,不会将新写入的文件备份进去的。
然后:
[root@laptop pyegrp]# dump -9 -u -f /dev/hda3 /home/pyegrp/
用restore tf /dev/hda3
就会看到刚刚写入的文件会出现在列表中。
restore命令是用来恢复备份的。
[root@laptop pyegrp]# restore rf /dev/hda3 /home/pyegrp
用restore命令来查看备份文件里的文件列表
[root@laptop pyegrp]# restore ft /dev/hda3
the usage of cpio,cut,find, gzip
cpio -covB > [file|device] --------备份
cpio -icduv /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!
范例二:检查磁带机上面有什么文件?
[root@linux ~]# cpio -icdvt /tmp/content
# 第一个动作当中,会将磁带机内的档名列出到萤幕上面,而我们可以透过第二个动作,
# 将所有的档名通通纪录到 /tmp/content 文件去!
范例三:将磁带上的资料还原回来~
[root@linux ~]# cpio -icduv /root/etc.cpio
# 这样就能够备份啰~您也可以将资料以 cpio -i > cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字元
test2
this i
cut其实很有用
-c m-n 表示显示每一行的第m个字元到第n个字元。例如:
gxy@gxy-desktop:~/saved$ cat file
liubi 23 14000
gxy@gxy-desktop:~/saved$ cut -f 1,3 file
liubi 23 14000
gxy@gxy-desktop:~/saved$ cut -f 1,3 -d ' ' file
liubi 14000
gxy@gxy-desktop:~/saved$ cut -f 1-3 -d ' ' file
liubi 23 14000
gxy@gxy-desktop:~/saved$ cut -f 1 -d ' ' file
liubi
gxy@gxy-desktop:~/saved$ cut -f3 -d ' ' file
14000
命令用法:
cut -b list [-n] [file ...]
cut -c list [file ...]
cut -f list [-d delim][-s][file ...]
l 上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);
l list表示-b、-c、-f操作范围,-n常常表示具体数字;
l file表示的自然是要操作的文本文件的名称;
l delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
l -s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)
上面三种方式中,表示从指定的范围中提取字节(-b)、或字符(-c)、或字段(-f)。
范围的表示方法:
N
只有第N项
N-
从第N项一直到行尾
N-M
从第N项到第M项(包括M)
-M
从一行的开始到第M项(包括M)
-
从一行的开始到结束的所有项
scp `find . -name "*.ko"` dest
ssh user@some.remotehost.com 'find /source/dir -name "*.pdf" -print0 | xargs -0 -J % scp % user@another.host.com:/dest/dir'
Everything after this looks like it was supposed to be part of a find command! Here's the problem: the -exec option sucks. Use -print0 and xargs -0. (This basically directs find to spit out a null-delimited list of files, and the -0 option to xargs directs it to expect a null-delimited list of files.)
Further, are you copying a bunch of stuff back to your computer? Rather than making new connections via scp, just send yourself a tarball.
find . -name "*.ko" |xargs -i scp {} 172.27.1.161:/root
转载 Linux文件查找命令find,xargs详述收藏
新一篇: Linux排序命令sort详解 | 旧一篇: Shell中的引号,反引号,双引号,反斜杠
前言:关于find命令
一、find 命令格式
1、find命令的一般形式为;
2、find命令的参数;
3、find命令选项;
4、使用exec或ok来执行shell命令;
二、find命令的例子;
1、查找当前用户主目录下的所有文件;
2、为了在当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;
5、为了查找系统中所有属于root组的文件;
6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件
7、为了查找当前文件系统中的所有目录并排序;
8、为了查找系统中所有的rmt磁带设备;
三、xargs
四、find 命令的参数;
1、使用name选项
2、用perm选项
3、忽略某个目录
4、使用find查找文件的时候怎么避开某个文件目录
5、使用user和nouser选项
6、使用group和nogroup选项
7、按照更改时间或访问时间等查找文件
8、查找比某个文件新或旧的文件
9、使用type选项
10、使用size选项
11、使用depth选项
12、使用mount选项
+++++++++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++++++++
前言:关于find命令
由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。
在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
一、find 命令格式
1、find命令的一般形式为;
find pathname -options [-print -exec -ok ...]
2、find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
3、find命令选项
-name
按照文件名查找文件。
-perm
按照文件权限来查找文件。
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
另外,下面三个的区别:
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变文件状态的文件
-ctime n
查找系统中最后n*24小时被改变文件状态的文件
-mmin n
查找系统中最后N分钟被改变文件数据的文件
-mtime n
查找系统中最后n*24小时被改变文件数据的文件
4、使用exec或ok来执行shell命令
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的
在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中
# find . -type f -exec ls -l { } \;
-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
在/logs目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec rm { } \;
记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。
在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
$ find . -name "*.conf" -mtime +5 -ok rm { } \;
? n
按y键删除文件,按n键不删除。
任何形式的命令都可以在-exec选项中使用。
在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。
# find /etc -name "passwd*" -exec grep "sam" { } \;
sam:x:501:501::/usr/sam:/bin/bash
二、find命令的例子;
1、查找当前用户主目录下的所有文件:
下面两种方法都可以使用
$ find $HOME -print
$ find ~ -print
2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
$ find . -type f -perm 644 -exec ls -l { } \;
3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
$ find / -type f -size 0 -exec ls -l { } \;
4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;
$ find /var/logs -type f -mtime +7 -ok rm { } \;
5、为了查找系统中所有属于root组的文件;
$find . -group root -exec ls -l { } \;
-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1
6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。
该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
rm { } \;
? n
? n
? n
? n
7、为了查找当前文件系统中的所有目录并排序;
$ find . -type d | sort
8、为了查找系统中所有的rmt磁带设备;
$ find /dev/rmt -print
三、xargs
xargs - build and execute command lines from standard input
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory: ISO-8859 text\
......
在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
$ find / -name "core" -print | xargs echo "" >/tmp/core.log
上面这个执行太慢,我改成在当前目录下查找
#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6
在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
# ls -l
drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf
# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
用grep命令在所有的普通文件中搜索hostname这个词:
# find . -type f -print | xargs grep "hostname"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:
# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
四、find 命令的参数
下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册
1、使用name选项
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。
$ find ~ -name "*.txt" -print
想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用:
$ find . -name "*.txt" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
想要在/etc目录中查找文件名以host开头的文件,可以用:
$ find /etc -name "host*" -print
想要查找$HOME目录中的文件,可以用:
$ find ~ -name "*" -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。
$ find / -name "*" -print
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$find . -name "[a-z][a-z][0--9][0--9].txt" -print
2、用perm选项
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。
如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
# ls -l
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp
-perm mode:文件许可正好符合mode
-perm +mode:文件许可部分符合mode
-perm -mode: 文件许可完全符合mode
3、忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
$ find /apps -path "/apps/bin" -prune -o -print
4、使用find查找文件的时候怎么避开某个文件目录
比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [-path ..] [expression] 在路径列表的后面的是表达式
-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为
if -path "/usr/sam" then
-prune
else
-print
避开多个文件夹
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
查找某一确定文件,-name等选项加在-o 之后
#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print
5、使用user和nouser选项
按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:
$ find ~ -user sam -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。
例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print
6、使用group和nogroup选项
就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:
$ find /apps -group gem -print
要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件
$ find / -nogroup-print
7、按照更改时间或访问时间等查找文件
如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
8、查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。
查找更改时间比文件sam新但比文件temp旧的文件:
例:有两个文件
-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
# find -newer httpd1.conf ! -newer temp -ls
1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf
1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp
1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel
查找更改时间在比temp文件新的文件:
$ find . -newer temp -print
9、使用type选项
在/etc目录下查找所有的目录,可以用:
$ find /etc -type d -print
在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
在/etc目录下查找所有的符号链接文件,可以用
$ find /etc -type l -print
10、使用size选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。
在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。
在当前目录下查找文件长度大于1 M字节的文件:
$ find . -size +1000000c -print
在/home/apache目录下查找文件长度恰好为100字节的文件:
$ find /home/apache -size 100c -print
在当前目录下查找长度超过10块的文件(一块等于512字节):
$ find . -size +10 -print
11、使用depth选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print
12、使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。
从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:
$ find . -name "*.XC" -mount -print
发表于 @ 2007年04月03日 16:04:00|评论(0)|编辑
新一篇: Linux排序命令sort详解 | 旧一篇: Shell中的引号,反引号,双引号,反斜杠
评论:没有评论。
发表评论
* 姓 名:请输入名字
* 主 页:
*
校验码: 检验码无效! 看不清,换一张
请输入评论
当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © woso
gunzip -c /boot/initrd-2.4.21-37.0.2.ELvmnix.img > /boot/tmp/initrd
mount -o loop -t ext2 /boot/tmp/initrd /boot/tmp/mnt/
命令: gzip
格式: gzip 选项 文件目录列表
功能: 用Lempel-ziv编码压缩文件
选项:
-c 压缩结果写入标准输出,原文件保持不变。缺省时gzip将原文件压缩为.gz文件,并删除原文件。
-v 输出处理信息。
-d 解压缩指定文件。
-t 测试压缩文件的完整性。
解释: 值得一提的是,gzip比compress压缩更加有效。
实例: 目的:压缩/mnt/lgx/a1.doc
命令:#gzip -v /mnt/lgx/a1.doc
结果:产生a1.doc.gz的压缩文件
tar命令:
參數
說明
c, --create
建立新的備份檔
f, --file
指定檔案
r, --append
新增檔案至備份檔結尾
--delete
將 .tar 中的某個檔案刪除
t, --list
列出備份檔內檔案清單
u, --update
僅置換檔案更新部分
v, --verbose
顯示指定執行過程
z, --gzip, --unzip
透過 gzip 處理備份檔
x, --extract
還原備份檔
-C 指定還原路徑
命令名
gzip, gunzip, zcat - 压缩或展开文件
总揽
gzip [ -acdfhlLnNrtvV19 ] [-S 后缀] [ 文件名 ... ]
gunzip [ -acfhlLnNrtvV ] [-S 后缀] [ 文件名 ... ]
zcat [ -fhLV ] [ 文件名 ... ]
描述
Gzip 采用Lempel-Ziv 编码算法(LZ77)压缩给定文件的大小。在可能的情况下, 每个文件被具有扩展名 .gz, 的文件所替换, 同时保留原属主状态,存取和修改时间 (在VMS系统下缺省扩展名为 -gz 在MSDOS、OS/2 FAT, Windows NT FAT 和Atari系统下,缺省扩展名为 z ) 如果未指定文件名,或者指定了一个名为"-"的文件名,则从标准输入读取数据,压缩的结果输出到标准输出。 Gzip 只尝试压缩常规文件,特别地,它将忽略符号连接。
如果压缩后的文件名对于所在的文件系统来说太长,
gzip 会将其截断。 Gzip 只尝试截断文件名中大于3个字符的段(每个段由点分隔)。如果文件名只由较小的段组成,最长的段将被截断。例如,如果文件名的长度限制是14个字符,文件 gzip.msdos.exe 将被压缩为gzi.msd.exe.gz。在没有文件名长度限制的系统中,文件名将不会被截断。
缺省情况下,
gzip 将原始文件名和时间信息保存在压缩后的文件中。当采用 -N 选项解压缩文件时,这些信息将被利用。在经过文件传输后文件名被截断及时间信息未被保留的情况下,这些信息将将用于恢复文件名及时间信息。
用
gzip -d 或者 gunzip 以及 zcat. 可以将压缩后的文件恢复到原始的形式。如果保留在压缩文件中的原始文件名不适合于当前的文件系统,将根据原文件名新建一个合法的文件名。
gunzip
将命令行中以.gz, -gz, .z, -z, _z 或 .Z结尾并具有正确标志头的文件解压缩,并以去掉扩展名的解压缩文件替换原文件。 gunzip 也能识别扩展名为 .tgz 和 .taz 的文件,并将其分别当作 .tar.gz 和 .tar.Z 的缩写。在压缩时,如果采用 .tar 扩展名则需要对文件名进行截断处理时, gzip 将采用 .tgz 作为扩展名。
gunzip
目前能够解压由 gzip, zip, compress, compress -H 以及 pack 产生的文件。对输入格式的检测是自动的。当采用前两种格式时, gunzip 检查一个32位的CRC校验码。对于 pack, gunzip 则检查压缩前的数据长度。标准的 compress 格式的设计无法实现一致性检查。但有时 gunzip 仍然能检测到坏的.Z文件。如果你在解压一个.Z文件时出现错误,不要简单地因为标准的 uncompress 没有报错就认定.Z文件是正确的。这通常意味着标准的 uncompress 没有检查它的输入数据,而盲目地产生了错误的输出。SCO的compress -H格式(lzh压缩方法)不包含CRC校验码,但也允许一些一致性检查。
由
zip 生成的文件, 如果其内容只有一个文件并且是以'deflation'方式压缩的,则可由gzip解压。这一特性只是为了方便将tar.zip 格式的文件转换为tar.gz格式而加入的。要解压含有多个文件的zip文件,请用 unzip.
zcat
的功能与 gunzip -c. 相同。 (在一些系统中, zcat 可能被安装成 gzcat 以保留 compress 与zcat的原有连接。) zcat 将命令行中列出的文件或由标准输入输入的数据解压,解压后的数据写到标准输出。 zcat 解压具有正确标志头的文件,而不管其是否带有 .gz 后缀。
Gzip
采用 zip 和 PKZIP 中所采用的Lempel-Ziv算法。得到的压缩比依赖于输入数据的大小以及公用子串的分布。例如源程序和英文文档能够压缩60-70%。压缩比通常比 LZW( compress 采用的算法)、Huffman编码( pack 所采用的算法)、以及自适应Huffman编码( RI compact ) 等方法要好得多。
即使压缩后的文件略大于原文件,压缩也照样进行。最坏的情况下,多出的数据包括
gzip文件头中的若干个字节,加上每块32K的5个字节,或者,对于大文件来说0.015% 的放大率。注意实际占用的硬盘块数目几乎从不增加。 gzip 在压缩和解压缩时保留原文件的属主和时间信息。
选项
-a --ascii
Ascii文本模式:按本地习惯转换行结束符。该选项仅在一些非Unix 系统上有效。对于MSDOS,在压缩时CR LF(译注:即回车和换行符)被转换为LF,在解压时LF被转换为CR LF。
-c --stdout --to-stdout
将结果写到标准输出;原文件保持不变。如果有多个输入文件,输出将由一系列独立的压缩文件组成。如果想得到较好的压缩率,在压缩前应将多个文件连在一起。
-d --decompress --uncompress
解压缩。
-f --force
强制压缩和解压缩,即使指定文件具有多重连接,或相应文件已经存在,或压缩数据来自或写往一个终端。如果输入数据是 gzip 无法识别的格式,同时在命令行中也给出了--stdout选项,gzip将把输入数据拷贝至标准输出而不做任何改动,就象cat所做的一样。如果未给出 -f 选项,并且未在后台运行, gzip 会提示用户以确认是否覆盖一个已存在的文件。
-h --help
显示帮助信息然后退出。
-l --list
列出每个压缩文件的如下项目:
compressed size: 压缩文件的长度
uncompressed size: 压缩前文件的长度
ratio: 压缩率(如果未知则为0.0%)
uncompressed_name: 压缩前的文件名
对于非gzip格式的文件,压缩前文件长度显示为-1,例如由compress压缩的.Z文件。可用下列命令得到这种文件压缩前的长度:
zcat file.Z | wc -c
如果同时指定了--verbose选项,下列项目也被列出:
method: 压缩方式
crc: 未压缩数据的32位CRC校验码
date & time: 压缩前文件的时间信息
目前支持的压缩方式有deflate、compress、lzh(SCO下的compress -H)以及pack等方式。对于非gzip格式的文件,crc校验码显示为ffffffff。
若指定了--name选项,如果有的话,压缩前文件名,日期以及时间是保存在压缩文件中的内容。
若指定了--verbose选项,还将列出所有文件的长度总和,除非某些文件的长度未知。若指定--quiet选项,将不显示标题和合计两行内容。
-L --license
显示 gzip 的许可证信息然后退出。
-n --no-name
在压缩时,缺省不保留原始文件名和时间信息。(如果必须对文件名作截断处理,则原始文件名总是被保存。) 在解压缩时,即使有也不恢复原始文件名(仅将压缩文件名中的 gzip 后缀去掉)和时间信息(拷贝压缩文件中相应信息)。该选项是压缩时的缺省选项。
-N --name
在压缩时总是保存原始文件名和时间信息;该选项为缺省选项。在解压缩时,如果存在原始文件名和时间信息则恢复之。该选项可用于对文件名长度有限制的系统,以及经过文件传输后丢失时间信息的情况。
-q --quiet
压制所有警告信息。
-r --recursive
递归地访问目录结构。如果命令行中有目录名, gzip 将进入目录并压缩所有找到的文件(如果执行的命令是 gunzip 则对其解压缩)。
-S .suf --suffix .suf
采用.suf后缀取代.gz后缀。可以指定任何后缀,但应避免使用除了.z和.gz以外的其它后缀,以免文件传输到其它系统时发生混淆。一个空后缀将迫使gunzip 解压缩所有文件而不管它具有什么样的后缀,例如:
gunzip -S "" * (在MSDOS下用*.*替换*)
以前版本的gzip采用.z后缀。为了避免与 pack(1). 冲突,后来作了改动。
-t --test
测试。检查压缩文件的完整性。
-v --verbose
详尽模式。显示每个压缩或解压缩文件的名字和压缩率。
-V --version
版本。显示版本号和编译选项后退出。 Version. Display the version number and compilation options then quit.
-# --fast --best
用指定的数字 # 调整压缩速度,其中 -1 及 --fast 对应最快压缩方式(压缩率较低), -9 及 --best 对应最慢压缩方式(压缩率最佳)。缺省的压缩级别为
- (也就是说,以速度为代价偏向于高压缩率)。
17.12 备份程序
有三个主要的备份程序 dump(8)、tar(1) 和 cpio(1)。
17.12.1 Dump 和 Restore
dump 和 restore 是 UNIX® 传统的备份程序。它以 block 而不是以文件为单位来备份数据、链接或目录。 dump 备份的是设备上的整个文件系统,不能只备份一一个文件系统的部分或是用到两个以上文件系统的目录树。 dump 不会写文件和目录到磁带机,而是写入包含文件 和目录的原始数据块。
注意: 如果在您的 root 目录使用 dump ,将不需要 备份 /home、/usr 或其他目录,因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。
dump 是最早出现于 AT&T UNIX 的 Version 6 (约 1975)。默认的参数适用于 9-track 磁带(6250 bpi),所以如果要用高密度的磁带(最高可达 62,182 ftpi),就不能用默认的参数,而要另外指定参数。这些默认值必须在命令行被修改以更好地利用当前磁带机的功能。
rdump 和 rrestore 可以通过网络在另一 台计算机的磁带机上备份数据。这两个程序都是依靠 rcmd(3) 和 ruserok(3) 来访问远程的磁带机。因此,运行备份的用户必须要有远程 主机的 .rhosts 访问权。rdump 和 rrestore 的参数必须适用于远程主机(例如,当您从 FreeBSD 连到 一台 SUN 工作站 knomodo 去使用磁带机时,使用:
# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1
要注意的是:必须检查您在使用 .rhosts 时的安全情况。
也可以通过使用 ssh 用一个更安全的方式来使用 dump 和 restore 。
例 17-1. 通过 ssh 使用 dump
# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz
或使用 dump 的 built-in 方法, 设置环境变量 RSH:
例 17-2. 通过设置 ssh 环境变量 RSH 使用 dump
# RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr
17.12.2 tar
tar(1) 也同样是在第 6 版 AT&T UNIX (大约是 1975 前后) 出现的。 tar 对文件系统直接操作; 其作用是把文件和目录写入磁带。 tar 并不支持 cpio(1) 所提供的全部功能, 但也不需要 cpio 所需要使用的诡异的命令行管道。
在 FreeBSD 5.3 和更高版本中, 同时提供了 GNU tar 和默认的 bsdtar。 GNU 的版本可以通过 gtar 来使用。 它通过与 rdump 一样的语法来支持远程设备。 要 tar 到连接在名为 komodo 的 Sun 机器上的 Exabyte 磁带机, 可以使用:
# /usr/bin/gtar cf komodo:/dev/nsa8 . 2>&1
您也可以让 bsdtar 通过管道和 rsh 将数据发送到远程的磁带机上。
# tar cf - . | rsh hostname dd of=tape-device obs=20b
如果您担心通过网络备份会有安全问题,应当使用 ssh ,而不是 rsh。
17.12.3 cpio
cpio(1) 是 UNIX 最早用来作文件交换的磁带机程序。它有执行字节交换的选项,可以用几种不同的格式写入,并且可以将数据用管道传给其他程序。 cpio 没办法自动查找目录树内的文件列表,必须通过标准 输入 stdin 来指定。
cpio 不支持通过网络的备份方式。可以使用 pipeline 和 rsh 来传送数据给远程的磁带机。
# for f in directory_list; do
find $f >> backup.list
done
# cpio -v -o --format=newc backup_device"
这里的 directory_list 是要备份的目录列表, user@host 结合了将要执行备份的用户名和主机名,backup_device 是写入备份的设备(如 /dev/nsa0)。
17.12.4 pax
pax(1) 是符合 IEEE/POSIX® 标准的程序。多年来各种不同版本 的 tar 和 cpio 间有些不兼容。为了防止这种情况,并使其标准化,POSIX 出了这套新的工具程序。 pax 尝试可以读写各种 cpio 和 tar 的格式,并可以自己增加新的格式。它的命令 集比 tar 更接近 cpio。
17.12.5 Amanda
Amanda (Advanced Maryland Network Disk Archiver) 并非单一的程序,而是一个客户机/服务器模式的备份系统 。一台 Amanda 服务器可以备份任意数量执行 Amanda 的客户机或是将连上 Amanda 服务器的计算机上的数据备份到一台磁带机上。一个常见的问题是,数据写入磁带机的时间将超过取行数据的时间,而 Amanda 解决了这个问题。它使用一个 “holding disk” 来同时备份几个文件系统。 Amanda 建立 “archive sets” 的一组磁带,用来备份在 Amanda 的配置文件中所列出的完整的文件系统。
Amanda 配置文件提供完整的备份控制及 Amanda 产生的网络传输。 Amanda 可以使用上述任何一个设备程序来向磁带写入数据。Amanda 可以从 port 或 package 取得,它并非系统默认安装的。
17.12.6 Do Nothing 备份策略
“Do nothing” 不是一个程序,而是被广泛使用的备份策略。不需要预算,不需要备份的计划表,全部都不用。如果您的数据发生了什么问题, 忽略它!
如果您的时间和数据不值得您做这些事,那么 “Do nothing” 将是最好的备份程序。要注意的是,UNIX 是相当好用的工具,您可能在几个月内,就发现您已经收集了不少对您来说相当具有价值的文件和程序。
“Do nothing” 对于像 /usr/obj 和其他可由您的计算机产生的文件来说,是最好的方法。例如这本手册包含有 HTML 或 PostScript® 格式的文件。这些文档格式是从 SGML 输入文件创建的。创建 HTML 或 PostScript 格式的文件的备份就没有必要了。只要经常备份 SGML 文件就够了。
17.12.7 哪个备份程序最好?
在dump(8) 时期 Elizabeth D. Zwicky 测试了所有以上列出的备份程序。在各种各样怪异的文件系统中, dump 是您明智的选择。Elizabeth 建立起各种各样、奇怪或常见的文件系统,并用各种备份程序,测试在各种文件系统上备份及恢复数据。这些怪异之处包括:具有 holes 和一个 nulls block 的文件,文件名具有有趣字符,无法读写的文件及设备,在备份时改变文件大小,在备份时建立或删除的文件。她将结果刑在: LISA V in Oct. 1991. See torture-testing Backup and Archive Programs.
17.12.8 应急恢复程序
17.12.8.1 在出现灾难前
在遇到灾难前,只需要执行以下四个步骤:
第一,打出您的每个磁盘驱动器的磁盘标签(例如: disklabel da0 | lpr),文件系统表, (/etc/fstab) ,以及所有启动信息,并将每个拷贝 两份。
第二,确定遇到的情况时,用来启动及修复的软盘 (boot.flp 和 fixit.flp) 具有您所有的设备代号。最简单的方法是用软盘启动,然后检查启动信息,如果设备都被列出,并且可以正常使用,就可以跳到第三步。
否则,必须建立两张传统的可启动软盘,并包含: fdisk, disklabel, newfs, mount, 以及所有使用的备份程序。这些程序必须被静态的连接。如果使用的是 dump,那么这张软盘就必须包含 restore。
第三,定期将数据备份到磁带。任何在上次备份后的改变都无法恢复。记得将磁盘写保护。
第四,测试在第二步所建立的软盘及备份的磁带,将过程记录下来,并和这张可启动的软盘和磁带放在一起。也许您在恢复时会想要,而这份记录将防止您破坏 您的磁带 (怎么说呢?因为您可能将 tar xvf /dev/sa0 打成 tar cvf /dev/sa0 而重写了备份磁带)。
为了安全,您可以每次都做两份备份磁带及一张启动磁盘,并将其中一份备份磁带存放在其它地方。其它地方不是指同一栋办公大楼的地下室 (世贸中心的一些公司应该学到了一些教训),而是真的要让人的磁带离您 的的计算机远远的。
例 17-3. 一个建立启动磁盘的 shell 脚本例子:
#!/bin/sh
#
# create a restore floppy
#
# format the floppy
#
PATH=/bin:/sbin:/usr/sbin:/usr/bin
fdformat -q fd0
if [ $? -ne 0 ]
then
echo "Bad floppy, please use a new one"
exit 1
fi
# place boot blocks on the floppy
#
disklabel -w -B /dev/fd0c fd1440
#
# newfs the one and only partition
#
newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/fd0a
#
# mount the new floppy
#
mount /dev/fd0a /mnt
#
# create required directories
#
mkdir /mnt/dev
mkdir /mnt/bin
mkdir /mnt/sbin
mkdir /mnt/etc
mkdir /mnt/root
mkdir /mnt/mnt # for the root partition
mkdir /mnt/tmp
mkdir /mnt/var
#
# populate the directories
#
if [ ! -x /sys/compile/MINI/kernel ]
then
cat /mnt/sbin/init
gzip -c -best /sbin/fsck > /mnt/sbin/fsck
gzip -c -best /sbin/mount > /mnt/sbin/mount
gzip -c -best /sbin/halt > /mnt/sbin/halt
gzip -c -best /sbin/restore > /mnt/sbin/restore
gzip -c -best /bin/sh > /mnt/bin/sh
gzip -c -best /bin/sync > /mnt/bin/sync
cp /root/.profile /mnt/root
cp -f /dev/MAKEDEV /mnt/dev
chmod 755 /mnt/dev/MAKEDEV
chmod 500 /mnt/sbin/init
chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt
chmod 555 /mnt/bin/sh /mnt/bin/sync
chmod 6555 /mnt/sbin/restore
#
# create the devices nodes
#
cd /mnt/dev
./MAKEDEV std
./MAKEDEV da0
./MAKEDEV da1
./MAKEDEV da2
./MAKEDEV sa0
./MAKEDEV pty0
cd /
#
# create minimum file system table
#
cat > /mnt/etc/fstab /mnt/etc/passwd /mnt/etc/master.passwd | rsh -l dd of= obs=20b
Name> obs=20b
在dec2上,以root登錄
#rsh dec1 "ls /tmp"
#tar cf - / | rsh -l root dec1 dd of=/dev/rmt0h obs=20b
備份詳解
http://72.14.203.104/search?q=cache:c1UQGDAbJDMJ:www.cc.nctu.edu.tw/faq/tapedriver.htm+%22rsh%22+%22.rhost%22+&hl=zh-TW&lr=&strip=1
tar zcvf - /home | ssh sysop@61.64.186.241 "cat > home.tgz"
tar zcvf - /var/www/html | ssh sysop@61.64.186.241 "cat > /dev/tape"
cd /usr/local
tar zcf - apache/ | ssh root@61.64.186.241 "cd /usr/local;mv apache apache.bak; tar zpxvf -"
把61.64.186.241的/usr/local/apache更名為/usr/local/apache.bak,然後把自己近端的/usr/local/apache原封不動搬過去
ssh root@61.64.186.241 "cd /usr/local/pacland; tar zpvxf - " /dev/null`)
then
/bin/echo $now >$datefile
/bin/chmod 600 $datefile
for tarfet in $targets
do
/bin/tar -cvzf $device_n \
-V "Full backup of $target on $now" \
$target
sleep 5
done
else
do
/bin/tar -cvzf $device_n \
-V "Differential backup of $target from $pre_full to $now" \
-N "$prev_full" \
$target
sleep 5
done
fi
/bin/mt -f $device rewind
sleep 1
/bin/mt -f $device offline
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/61797/showart_1884369.html |
|