filearchiv.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 3,680 行 · 第 1/5 页

HTML
3,680
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>文件与归档命令</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="外部过滤器, 程序和命令"HREF="external.html"><LINKREL="PREVIOUS"TITLE="文本处理命令"HREF="textproc.html"><LINKREL="NEXT"TITLE="通讯命令"HREF="communications.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="textproc.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">12. 外部过滤器, 程序和命令</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="communications.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="FILEARCHIV">12.5. 文件与归档命令</A></H1><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="FAARCHIVING1"></A>归档命令</B></P><DL><DT><ANAME="TARREF"></A><BCLASS="COMMAND">tar</B></DT><DD><P>标准的UNIX归档工具.	        <ANAME="AEN8734"HREF="#FTN.AEN8734"><SPANCLASS="footnote">[1]</SPAN></A>			起初这只是一个<ICLASS="WORDASWORD">磁带归档</I>程序, 			而现在这个工具已经被开发为通用打包程序, 			它能够处理所有设备的所有类型的归档文件, 			包括磁带设备, 正常文件, 甚至是<TTCLASS="FILENAME">stdout</TT>(请参考<AHREF="special-chars.html#EX58">例子 3-4</A>). 				GNU的tar工具现在可以接受不同种类的压缩过滤器, 				比如<BCLASS="COMMAND">tar czvf archive_name.tar.gz *</B>, 				并且可以递归的处理归档文件, 				还可以用<AHREF="filearchiv.html#GZIPREF">gzips</A>压缩目录下的所有文件, 				除了当前目录下(<BCLASS="COMMAND">$PWD</B>)的<AHREF="basic.html#DOTFILESREF">点文件</A>. 		<ANAME="AEN8744"HREF="#FTN.AEN8744"><SPANCLASS="footnote">[2]</SPAN></A>            </P><P>一些有用的<BCLASS="COMMAND">tar</B>命令选项:   	      <P></P><OLTYPE="1"><LI><P><CODECLASS="OPTION">-c</CODE> 创建(一个新的归档文件)</P></LI><LI><P><CODECLASS="OPTION">-x</CODE> 解压文件(从存在的归档文件中)</P></LI><LI><P><CODECLASS="OPTION">--delete</CODE> 删除文件(从存在的归档文件中)</P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>这个选项不能用于磁带类型设备. </P></TD></TR></TABLE></DIV></LI><LI><P><CODECLASS="OPTION">-r</CODE> 将文件添加到现存的归档文件的尾部</P></LI><LI><P><CODECLASS="OPTION">-A</CODE> 将<EM>tar</EM>文件添加到现存的归档文件的尾部</P></LI><LI><P><CODECLASS="OPTION">-t</CODE> 列出现存的归档文件中包含的内容</P></LI><LI><P><CODECLASS="OPTION">-u</CODE> 更新归档文件</P></LI><LI><P><CODECLASS="OPTION">-d</CODE> 使用指定的文件系统, 					比较归档文件</P></LI><LI><P><CODECLASS="OPTION">-z</CODE> 用<AHREF="filearchiv.html#GZIPREF">gzip</A>压缩归档文件</P><P>(压缩还是解压, 	  依赖于是否组合了<CODECLASS="OPTION">-c</CODE>或<CODECLASS="OPTION">-x</CODE>)选项</P></LI><LI><P><CODECLASS="OPTION">-j</CODE>		  用<AHREF="filearchiv.html#BZIPREF">bzip2</A>压缩归档文件</P></LI></OL>	      </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>如果想从损坏的用<EM>gzipped</EM>压缩过的tar文件中取得数据, 				  那将是非常困难的. 所以当我们归档重要的文件的时候, 				  一定要保留多个备份.	      </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">shar</B></DT><DD><P>Shell归档工具. 			  存在于shell归档文件中的所有文件都是未经压缩的, 			  并且本质上是一个shell脚本, 			  以<SPANCLASS="TOKEN">#!/bin/sh</SPAN>开头, 并且包含所有必要的解档命令. 	      <ICLASS="FIRSTTERM">Shar 归档文件</I>至今还在Internet新闻组中使用, 		  否则的话, <BCLASS="COMMAND">shar</B>早就被<BCLASS="COMMAND">tar</B>/<BCLASS="COMMAND">gzip</B>所取代了. 	      <BCLASS="COMMAND">unshar</B>命令用来解档<ICLASS="FIRSTTERM">shar</I>归档文件. </P></DD><DT><BCLASS="COMMAND">ar</B></DT><DD><P>创建和操作归档文件的工具, 			  主要在对二进制目标文件打包成库时才会用到. </P></DD><DT><ANAME="RPMREF"></A><BCLASS="COMMAND">rpm</B></DT><DD><P><EM>Red Hat包管理器</EM>, 			  或者说<BCLASS="COMMAND">rpm</B>工具提供了一种对源文件或二进制文件进行打包的方法. 			  除此之外, 它还包括安装命令, 并且还检查包的完整性. 	      </P><P>一个简单的<BCLASS="COMMAND">rpm -i package_name.rpm</B>命令对于安装一个包来说就足够了, 			  虽然这个命令还有好多其它的选项. 	      </P><DIVCLASS="TIP"><P></P><TABLECLASS="TIP"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/tip.gif"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><KBDCLASS="USERINPUT">rpm -qf</KBD> 列出一个文件属于那个包. 	      </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rpm -qf /bin/ls</KBD><SAMPCLASS="COMPUTEROUTPUT">coreutils-5.2.1-31</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P></TD></TR></TABLE></DIV><DIVCLASS="TIP"><P></P><TABLECLASS="TIP"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/tip.gif"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><KBDCLASS="USERINPUT">rpm -qa</KBD>将会列出给定系统上所有安装了的	      <EM>rpm</EM>包. 	      <KBDCLASS="USERINPUT">rpm -qa package_name</KBD>命令将会列出与给定名字<TTCLASS="FILENAME">package_name</TT>相匹配的包. 	      </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rpm -qa</KBD><SAMPCLASS="COMPUTEROUTPUT">redhat-logos-1.1.3-1 glibc-2.2.4-13 cracklib-2.7-12 dosfstools-2.7-1 gdbm-1.8.0-10 ksymoops-2.4.1-1 mktemp-1.5-11 perl-5.6.0-17 reiserfs-utils-3.x.0j-2 ...</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rpm -qa docbook-utils</KBD><SAMPCLASS="COMPUTEROUTPUT">docbook-utils-0.6.9-2</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">rpm -qa docbook | grep docbook</KBD><SAMPCLASS="COMPUTEROUTPUT">docbook-dtd31-sgml-1.0-10 docbook-style-dsssl-1.64-3 docbook-dtd30-sgml-1.0-10 docbook-dtd40-sgml-1.0-11 docbook-utils-pdf-0.6.9-2 docbook-dtd41-sgml-1.0-10 docbook-utils-0.6.9-2</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">cpio</B></DT><DD><P>这个特殊的归档拷贝命令(拷贝输入和输出, 			  <BCLASS="COMMAND">c</B>o<BCLASS="COMMAND">p</B>y			  <BCLASS="COMMAND">i</B>nput and <BCLASS="COMMAND">o</B>utput)现在已经很少能见到了, 			  因为它已经被<BCLASS="COMMAND">tar</B>/<BCLASS="COMMAND">gzip</B>所替代了. 			  现在这个命令只在一些比较特殊的地方还在使用, 			  比如拷贝一个目录树. 如果指定一个合适尺寸的块(用于拷贝), 			  那么这个命令会比<BCLASS="COMMAND">tar</B>命令快一些. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX48"></A><P><B>例子 12-27. 使用<BCLASS="COMMAND">cpio</B>来拷贝一个目录树</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;# 使用cpio来拷贝目录树.  4&nbsp;  5&nbsp;# 使用'cpio'的优点:   6&nbsp;#   加速拷贝. 比通过管道使用'tar'命令快一些.  7&nbsp;#   很适合拷贝一些'cp'命令  8&nbsp;#+  搞不定的的特殊文件(比如名字叫pipes的文件, 等等)  9&nbsp; 10&nbsp;ARGS=2 11&nbsp;E_BADARGS=65 12&nbsp; 13&nbsp;if [ $# -ne "$ARGS" ] 14&nbsp;then 15&nbsp;  echo "Usage: `basename $0` source destination" 16&nbsp;  exit $E_BADARGS 17&nbsp;fi   18&nbsp; 19&nbsp;source=$1 20&nbsp;destination=$2 21&nbsp; 22&nbsp; 23&nbsp;find "$source" -depth | cpio -admvp "$destination" 24&nbsp;#               ^^^^^         ^^^^^ 25&nbsp;# 阅读'find'和'cpio'的man页来了解这些选项的意义.  26&nbsp;                                                          27&nbsp;                                                          28&nbsp;# 练习: 29&nbsp;# ----- 30&nbsp;                                                          31&nbsp;#  添加一些代码来检查'find | cpio'管道命令的退出码($?) 32&nbsp;#+ 并且如果出现错误的时候输出合适的错误码.  33&nbsp; 34&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><BCLASS="COMMAND">rpm2cpio</B></DT><DD><P>这个命令可以从<AHREF="filearchiv.html#RPMREF">rpm</A>归档文件中解出一个<BCLASS="COMMAND">cpio</B>归档文件. </P><DIVCLASS="EXAMPLE"><HR><ANAME="DERPM"></A><P><B>例子 12-28. 解包一个<EM>rpm</EM>归档文件</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# de-rpm.sh: 解包一个'rpm'归档文件  3&nbsp;  4&nbsp;: ${1?"Usage: `basename $0` target-file"}  5&nbsp;# 必须指定'rpm'归档文件名作为参数.   6&nbsp;  7&nbsp;  8&nbsp;TEMPFILE=$$.cpio                         # Tempfile必须是一个"唯一"的名字.  9&nbsp;                                         # $$是这个脚本的进程ID. 10&nbsp;                                                                                  11&nbsp;rpm2cpio &#60; $1 &#62; $TEMPFILE                # 将rpm归档文件转换为cpio归档文件. 12&nbsp;cpio --make-directories -F $TEMPFILE -i  # 解包cpio归档文件. 13&nbsp;rm -f $TEMPFILE                          # 删除cpio归档文件. 14&nbsp; 15&nbsp;exit 0 16&nbsp; 17&nbsp;#  练习: 18&nbsp;#  添加一些代码来检查    1) "target-file"是否存在 19&nbsp;#+                       2) 这个文件是否是一个rpm归档文件. 20&nbsp;#  暗示:                    分析'file'命令的输出.</PRE></FONT></TD></TR></TABLE><HR></DIV></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="FACOMPRESSION1"></A>压缩命令</B></P><DL><DT><ANAME="GZIPREF"></A><BCLASS="COMMAND">gzip</B></DT><DD><P>标准的GNU/UNIX压缩工具, 			  取代了比较差的<BCLASS="COMMAND">compress</B

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?