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 #!/bin/bash 2 3 # 使用cpio来拷贝目录树. 4 5 # 使用'cpio'的优点: 6 # 加速拷贝. 比通过管道使用'tar'命令快一些. 7 # 很适合拷贝一些'cp'命令 8 #+ 搞不定的的特殊文件(比如名字叫pipes的文件, 等等) 9 10 ARGS=2 11 E_BADARGS=65 12 13 if [ $# -ne "$ARGS" ] 14 then 15 echo "Usage: `basename $0` source destination" 16 exit $E_BADARGS 17 fi 18 19 source=$1 20 destination=$2 21 22 23 find "$source" -depth | cpio -admvp "$destination" 24 # ^^^^^ ^^^^^ 25 # 阅读'find'和'cpio'的man页来了解这些选项的意义. 26 27 28 # 练习: 29 # ----- 30 31 # 添加一些代码来检查'find | cpio'管道命令的退出码($?) 32 #+ 并且如果出现错误的时候输出合适的错误码. 33 34 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 #!/bin/bash 2 # de-rpm.sh: 解包一个'rpm'归档文件 3 4 : ${1?"Usage: `basename $0` target-file"} 5 # 必须指定'rpm'归档文件名作为参数. 6 7 8 TEMPFILE=$$.cpio # Tempfile必须是一个"唯一"的名字. 9 # $$是这个脚本的进程ID. 10 11 rpm2cpio < $1 > $TEMPFILE # 将rpm归档文件转换为cpio归档文件. 12 cpio --make-directories -F $TEMPFILE -i # 解包cpio归档文件. 13 rm -f $TEMPFILE # 删除cpio归档文件. 14 15 exit 0 16 17 # 练习: 18 # 添加一些代码来检查 1) "target-file"是否存在 19 #+ 2) 这个文件是否是一个rpm归档文件. 20 # 暗示: 分析'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 + -
显示快捷键?