filearchiv.html

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

HTML
3,680
字号
>命令. 			  相应的解压命令是<BCLASS="COMMAND">gunzip</B>, 			  与<BCLASS="COMMAND">gzip -d</B>是等价的. </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><CODECLASS="OPTION">-c</CODE>选项将会把<BCLASS="COMMAND">gzip</B>的输出打印到<TTCLASS="FILENAME">stdout</TT>上. 		当你想通过<AHREF="special-chars.html#PIPEREF">管道</A>传递到其他命令的时候, 		这就非常有用了. </P></TD></TR></TABLE></DIV><P><BCLASS="COMMAND">zcat</B>过滤器可以将一个<EM>gzip</EM>文件解压到<TTCLASS="FILENAME">stdout</TT>, 	所以尽可能的使用管道和重定向. 	这个命令事实上就是一个可以工作于压缩文件(包括一些的使用老的<BCLASS="COMMAND">compress</B>工具压缩的文件)的<BCLASS="COMMAND">cat</B>命令. 	      <BCLASS="COMMAND">zcat</B>命令等价于<BCLASS="COMMAND">gzip -dc</B>. </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>在某些商业的UNIX系统上, 			  <BCLASS="COMMAND">zcat</B>与<BCLASS="COMMAND">uncompress -c</B>等价, 	      并且不能工作于<EM>gzip</EM>文件. 	      </P></TD></TR></TABLE></DIV><P>请参考<AHREF="comparison-ops.html#EX14">例子 7-7</A>. </P></DD><DT><ANAME="BZIPREF"></A><BCLASS="COMMAND">bzip2</B></DT><DD><P>用来压缩的一个可选的工具, 			  通常比<BCLASS="COMMAND">gzip</B>命令压缩率更高(所以更慢), 			  适用于比较大的文件. 相应的解压命令是<BCLASS="COMMAND">bunzip2</B>. </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>新版本的<AHREF="filearchiv.html#TARREF">tar</A>命令已经直接支持<BCLASS="COMMAND">bzip2</B>了. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">compress</B>, <BCLASS="COMMAND">uncompress</B></DT><DD><P>这是一个老的, 私有的压缩工具, 			  一般的商业UNIX发行版都会有这个工具. 			  更有效率的<BCLASS="COMMAND">gzip</B>工具早就把这个工具替换掉了. 	      Linux发行版一般也会包含一个兼容的<BCLASS="COMMAND">compress</B>命令, 	      虽然<BCLASS="COMMAND">gunzip</B>也可以解压用<BCLASS="COMMAND">compress</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><BCLASS="COMMAND">znew</B>命令可以将<EM>compress</EM>压缩的文件转换为<EM>gzip</EM>压缩的文件. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">sq</B></DT><DD><P>另一种压缩工具, 一个只能工作于排过序的ASCII单词列表的过滤器. 			  这个命令使用过滤器标准的调用语法, 	      <BCLASS="COMMAND">sq &#60; input-file &#62;			  output-file</B>. 速度很快, 		  但是效率远不及<AHREF="filearchiv.html#GZIPREF">gzip</A>. 		  相应的解压命令为<BCLASS="COMMAND">unsq</B>, 		  调用方法与<BCLASS="COMMAND">sq</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><BCLASS="COMMAND">sq</B>的输出可以通过管道传递给<BCLASS="COMMAND">gzip</B>, 			 以便于进一步的压缩. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">zip</B>, <BCLASS="COMMAND">unzip</B></DT><DD><P>跨平台的文件归档和压缩工具, 			  与DOS下的<EM>pkzip.exe</EM>兼容. 	      <SPANCLASS="QUOTE">"Zip"</SPAN>归档文件看起来在互联网上比<SPANCLASS="QUOTE">"tar包"</SPAN>更流行. </P></DD><DT><BCLASS="COMMAND">unarc</B>, <BCLASS="COMMAND">unarj</B>, <BCLASS="COMMAND">unrar</B></DT><DD><P>这些Linux工具可以用来解档那些用DOS下的<EM>arc.exe</EM>, 			<EM>arj.exe</EM>, 			和<EM>rar.exe</EM> 程序进行归档的文件. </P></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="FAINFORMATION1"></A>文件信息</B></P><DL><DT><ANAME="FILEREF"></A><BCLASS="COMMAND">file</B></DT><DD><P>确定文件类型的工具. 			  命令<KBDCLASS="USERINPUT">file file-name</KBD>将会用<SAMPCLASS="COMPUTEROUTPUT">ascii文本</SAMP>或<SAMPCLASS="COMPUTEROUTPUT">数据</SAMP>的形式返回<TTCLASS="FILENAME">file-name</TT>文件的详细描述. 	      这个命令会使用<TTCLASS="FILENAME">/usr/share/magic</TT>, 	      <TTCLASS="FILENAME">/etc/magic</TT>, 		  或<TTCLASS="FILENAME">/usr/lib/magic</TT>中定义的<AHREF="sha-bang.html#MAGNUMREF">魔法数字</A>来标识包含某种魔法数字的文件, 		  上边所举出的这3个文件需要依赖于具体的 Linux/UNIX 发行版. 	      </P><P><CODECLASS="OPTION">-f</CODE>选项将会让<BCLASS="COMMAND">file</B>命令运行于批处理模式, 			  也就是说它会分析<CODECLASS="OPTION">-f</CODE>后边所指定的文件, 			  从中读取需要处理的文件列表, 			  然后依次执行<BCLASS="COMMAND">file</B>命令. 			  <CODECLASS="OPTION">-z</CODE>选项, 			  当对压缩过的目标文件使用时, 			  将会强制分析压缩的文件类型. 	      </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">file test.tar.gz</KBD><SAMPCLASS="COMPUTEROUTPUT">test.tar.gz: gzip compressed data, deflated, last modified: Sun Sep 16 13:34:51 2001, os: Unix</SAMP><SAMPCLASS="PROMPT">bash </SAMP><KBDCLASS="USERINPUT">file -z test.tar.gz</KBD><SAMPCLASS="COMPUTEROUTPUT">test.tar.gz: GNU tar archive (gzip compressed data, deflated, last modified: Sun Sep 16 13:34:51 2001, os: Unix)</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P><P>	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# 在给定的目录中找出sh和Bash脚本文件:  2&nbsp;  3&nbsp;DIRECTORY=/usr/local/bin  4&nbsp;KEYWORD=Bourne  5&nbsp;# Bourne和Bourne-Again shell脚本  6&nbsp;  7&nbsp;file $DIRECTORY/* | fgrep $KEYWORD  8&nbsp;  9&nbsp;# 输出: 10&nbsp; 11&nbsp;# /usr/local/bin/burn-cd:          Bourne-Again shell script text executable 12&nbsp;# /usr/local/bin/burnit:           Bourne-Again shell script text executable 13&nbsp;# /usr/local/bin/cassette.sh:      Bourne shell script text executable 14&nbsp;# /usr/local/bin/copy-cd:          Bourne-Again shell script text executable 15&nbsp;# . . .</PRE></FONT></TD></TR></TABLE>	    </P><DIVCLASS="EXAMPLE"><HR><ANAME="STRIPC"></A><P><B>例子 12-29. 从C文件中去掉注释</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# strip-comment.sh: 去掉C程序中的注释(/* 注释 */).   3&nbsp;  4&nbsp;E_NOARGS=0  5&nbsp;E_ARGERROR=66  6&nbsp;E_WRONG_FILE_TYPE=67  7&nbsp;  8&nbsp;if [ $# -eq "$E_NOARGS" ]  9&nbsp;then 10&nbsp;  echo "Usage: `basename $0` C-program-file" &#62;&#38;2 # 将错误消息发到stderr. 11&nbsp;  exit $E_ARGERROR 12&nbsp;fi   13&nbsp; 14&nbsp;# 检查文件类型是否正确.  15&nbsp;type=`file $1 | awk '{ print $2, $3, $4, $5 }'` 16&nbsp;# "file $1" echo出文件类型 . . . 17&nbsp;# 然后awk会删掉第一个域, 就是文件名 . . . 18&nbsp;# 然后结果将会传递到变量"type"中. 19&nbsp;correct_type="ASCII C program text" 20&nbsp; 21&nbsp;if [ "$type" != "$correct_type" ] 22&nbsp;then 23&nbsp;  echo 24&nbsp;  echo "This script works on C program files only." 25&nbsp;  echo 26&nbsp;  exit $E_WRONG_FILE_TYPE 27&nbsp;fi   28&nbsp; 29&nbsp; 30&nbsp;# 相当隐秘的sed脚本: 31&nbsp;#-------- 32&nbsp;sed ' 33&nbsp;/^\/\*/d 34&nbsp;/.*\*\//d 35&nbsp;' $1 36&nbsp;#-------- 37&nbsp;# 如果你花上几个小时来学习sed语法的话, 上边这个命令还是很好理解的. 38&nbsp;                                                                      39&nbsp;                                                                      40&nbsp;#  如果注释和代码在同一行上, 上边的脚本就不行了. 41&nbsp;#+ 所以需要添加一些代码来处理这种情况. 42&nbsp;#  这是一个很重要的练习. 43&nbsp;                                                                      44&nbsp;#  当然, 上边的代码也会删除带有"*/"的非注释行 -- 45&nbsp;#+ 这也不是一个令人满意的结果. 46&nbsp; 47&nbsp;exit 0 48&nbsp; 49&nbsp; 50&nbsp;# ---------------------------------------------------------------- 51&nbsp;# 下边的代码不会执行, 因为上边已经'exit 0'了. 52&nbsp;                                                 53&nbsp;# Stephane Chazelas建议使用下边的方法: 54&nbsp; 55&nbsp;usage() { 56&nbsp;  echo "Usage: `basename $0` C-program-file" &#62;&#38;2 57&nbsp;  exit 1 58&nbsp;} 59&nbsp; 60&nbsp;WEIRD=`echo -n -e '\377'`   # 或者WEIRD=$'\377' 61&nbsp;[[ $# -eq 1 ]] || usage 62&nbsp;case `file "$1"` in 63&nbsp;  *"C program text"*) sed -e "s%/\*%${WEIRD}%g;s%\*/%${WEIRD}%g" "$1" \ 64&nbsp;     | tr '\377\n' '\n\377' \ 65&nbsp;     | sed -ne 'p;n' \ 66&nbsp;     | tr -d '\n' | tr '\377' '\n';; 67&nbsp;  *) usage;; 68&nbsp;esac 69&nbsp; 70&nbsp;#  如果是下列的这些情况, 还是很糟糕: 71&nbsp;#  printf("/*"); 72&nbsp;#  或者 73&nbsp;#  /*  /* buggy embedded comment */ 74&nbsp;#                                                                 75&nbsp;#  为了处理上边所有这些特殊情况(字符串中的注释, 含有 \", \\" ... 76&nbsp;#+ 的字符串中的注释)唯一的方法还是写一个C分析器 77&nbsp;#+ (或许可以使用lex或者yacc?). 78&nbsp; 79&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><ANAME="WHICHREF"></A><BCLASS="COMMAND">which</B></DT><DD><P><BCLASS="COMMAND">which command-xxx</B>将会给出<SPANCLASS="QUOTE">"command-xxx"</SPAN>的完整路径. 			  当你想在系统中准确定位一个特定的命令或工具的时候, 			  这个命令就非常有用了. 	      </P><P><KBDCLASS="USERINPUT">$bash which rm</KBD><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="COMPUTEROUTPUT">/usr/bin/rm</SAMP></PRE></FONT></TD></TR></TABLE>	  </P></DD><DT><BCLASS="COMMAND">whereis</B></DT><DD><P>与上边的<BCLASS="COMMAND">which</B>很相似, 			<BCLASS="COMMAND">whereis command-xxx</B>不只会给出<SPANCLASS="QUOTE">"command-xxx"</SPAN>的完整路径, 			而且还会给出这个命令的<EM>man页</EM>的完整路径. </P><P><KBDCLASS="USERINPUT">$bash whereis rm</KBD><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="COMPUTEROUTPUT">rm: /bin/rm /usr/share/man/man1/rm.1.bz2</SAMP></PRE></FONT></TD></TR></TABLE>	  </P></DD><DT><ANAME="WHATISREF"></A><BCLASS="COMMAND">whatis</B></DT><DD><P><BCLASS="COMMAND">whatis filexxx</B>将会在<TTCLASS="REPLACEABLE"><I>whatis</I></TT>数据库中查询<SPANCLASS="QUOTE">"filexxx"</SPAN>. 			当你想确认系统命令和重要的配置文件的时候, 			这个命令就非常重要了. 			可以把这个命令认为是一个简单的<BCLASS="COMMAND">man</B>命令. 	      </P><P><KBDCLASS="USERINPUT">$bash whatis whatis</KBD><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="COMPUTEROUTPUT">whatis               (1)  - search the whatis database for complete words</SAMP></PRE></FONT></TD></TR></TABLE

⌨️ 快捷键说明

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