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 < input-file > 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 # 在给定的目录中找出sh和Bash脚本文件: 2 3 DIRECTORY=/usr/local/bin 4 KEYWORD=Bourne 5 # Bourne和Bourne-Again shell脚本 6 7 file $DIRECTORY/* | fgrep $KEYWORD 8 9 # 输出: 10 11 # /usr/local/bin/burn-cd: Bourne-Again shell script text executable 12 # /usr/local/bin/burnit: Bourne-Again shell script text executable 13 # /usr/local/bin/cassette.sh: Bourne shell script text executable 14 # /usr/local/bin/copy-cd: Bourne-Again shell script text executable 15 # . . .</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 #!/bin/bash 2 # strip-comment.sh: 去掉C程序中的注释(/* 注释 */). 3 4 E_NOARGS=0 5 E_ARGERROR=66 6 E_WRONG_FILE_TYPE=67 7 8 if [ $# -eq "$E_NOARGS" ] 9 then 10 echo "Usage: `basename $0` C-program-file" >&2 # 将错误消息发到stderr. 11 exit $E_ARGERROR 12 fi 13 14 # 检查文件类型是否正确. 15 type=`file $1 | awk '{ print $2, $3, $4, $5 }'` 16 # "file $1" echo出文件类型 . . . 17 # 然后awk会删掉第一个域, 就是文件名 . . . 18 # 然后结果将会传递到变量"type"中. 19 correct_type="ASCII C program text" 20 21 if [ "$type" != "$correct_type" ] 22 then 23 echo 24 echo "This script works on C program files only." 25 echo 26 exit $E_WRONG_FILE_TYPE 27 fi 28 29 30 # 相当隐秘的sed脚本: 31 #-------- 32 sed ' 33 /^\/\*/d 34 /.*\*\//d 35 ' $1 36 #-------- 37 # 如果你花上几个小时来学习sed语法的话, 上边这个命令还是很好理解的. 38 39 40 # 如果注释和代码在同一行上, 上边的脚本就不行了. 41 #+ 所以需要添加一些代码来处理这种情况. 42 # 这是一个很重要的练习. 43 44 # 当然, 上边的代码也会删除带有"*/"的非注释行 -- 45 #+ 这也不是一个令人满意的结果. 46 47 exit 0 48 49 50 # ---------------------------------------------------------------- 51 # 下边的代码不会执行, 因为上边已经'exit 0'了. 52 53 # Stephane Chazelas建议使用下边的方法: 54 55 usage() { 56 echo "Usage: `basename $0` C-program-file" >&2 57 exit 1 58 } 59 60 WEIRD=`echo -n -e '\377'` # 或者WEIRD=$'\377' 61 [[ $# -eq 1 ]] || usage 62 case `file "$1"` in 63 *"C program text"*) sed -e "s%/\*%${WEIRD}%g;s%\*/%${WEIRD}%g" "$1" \ 64 | tr '\377\n' '\n\377' \ 65 | sed -ne 'p;n' \ 66 | tr -d '\n' | tr '\377' '\n';; 67 *) usage;; 68 esac 69 70 # 如果是下列的这些情况, 还是很糟糕: 71 # printf("/*"); 72 # 或者 73 # /* /* buggy embedded comment */ 74 # 75 # 为了处理上边所有这些特殊情况(字符串中的注释, 含有 \", \\" ... 76 #+ 的字符串中的注释)唯一的方法还是写一个C分析器 77 #+ (或许可以使用lex或者yacc?). 78 79 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 + -
显示快捷键?