5—文件与归档命令
5.1 tar
标准的UNIX归档工具. [1] 起初这只是一个磁带归档程序, 而现在这个工具已经被开发为通用打包程序, 它能够处理所有设备的所有类型的归档文件, 包括磁带设备, 正常文件, 甚至是stdout(请参考例子 3-4). GNU的tar工具现在可以接受不同种类的压缩过滤器, 比如tar czvf archive_name.tar.gz *, 并且可以递归的处理归档文件, 还可以用gzips压缩目录下的所有文件, 除了当前目录下($PWD)的点文件. [2]
一些有用的tar命令选项:
-c 创建(一个新的归档文件)
-x 解压文件(从存在的归档文件中)
--delete 删除文件(从存在的归档文件中)
这个选项不能用于磁带类型设备.
-r 将文件添加到现存的归档文件的尾部
-A 将tar文件添加到现存的归档文件的尾部
-t 列出现存的归档文件中包含的内容
-u 更新归档文件
-d 使用指定的文件系统, 比较归档文件
-z 用gzip压缩归档文件
(压缩还是解压, 依赖于是否组合了-c或-x)选项
-j 用bzip2压缩归档文件
5.2 shar
Shell归档工具. 存在于shell归档文件中的所有文件都是未经压缩的, 并且本质上是一个shell脚本, 以#!/bin/sh开头, 并且包含所有必要的解档命令. Shar 归档文件至今还在Internet新闻组中使用, 否则的话, shar早就被tar/gzip所取代了. unshar命令用来解档shar归档文件.
5.3 ar
创建和操作归档文件的工具, 主要在对二进制目标文件打包成库时才会用到.
5.4 rpm
Red Hat包管理器, 或者说rpm工具提供了一种对源文件或二进制文件进行打包的方法. 除此之外, 它还包括安装命令, 并且还检查包的完整性. (需要完善)
5.5 cpio
这个特殊的归档拷贝命令(拷贝输入和输出, copy input and output)现在已经很少能见到了, 因为它已经被tar/gzip所替代了. 现在这个命令只在一些比较特殊的地方还在使用, 比如拷贝一个目录树. 如果指定一个合适尺寸的块(用于拷贝), 那么这个命令会比tar命令快一些.
5.6 压缩命令gzip
标准的GNU/UNIX压缩工具, 取代了比较差的compress命令. 相应的解压命令是gunzip, 与gzip -d是等价的.
-c选项将会把gzip的输出打印到stdout上. 当你想通过管道传递到其他命令的时候, 这就非常有用了.
5.7 zcat过滤器可以将一个gzip文件解压到stdout, 所以尽可能的使用管道和重定向. 这个命令事实上就是一个可以工作于压缩文件(包括一些的使用老的compress工具压缩的文件)的cat命令. zcat命令等价于gzip -dc.
5.8 bzip2
用来压缩的一个可选的工具, 通常比gzip命令压缩率更高(所以更慢), 适用于比较大的文件. 相应的解压命令是bunzip2.
5.9 compress, uncompress
这是一个老的, 私有的压缩工具, 一般的商业UNIX发行版都会有这个工具. 更有效率的gzip工具早就把这个工具替换掉了. Linux发行版一般也会包含一个兼容的compress命令, 虽然gunzip也可以解压用compress工具压缩的文件.
znew命令可以将compress压缩的文件转换为gzip压缩的文件.
5.10sq 另一种压缩工具, 一个只能工作于排过序的ASCII单词列表的过滤器. 这个命令使用过滤器标准的调用语法, sq < input-file > output-file. 速度很快, 但是效率远不及gzip. 相应的解压命令为unsq, 调用方法与sq相同.
sq的输出可以通过管道传递给gzip, 以便于进一步的压缩.
5.11 zip, unzip
跨平台的文件归档和压缩工具, 与DOS下的pkzip.exe兼容. "Zip"归档文件看起来在互联网上比"tar包"更流行.
5.12 unarc, unarj, unrar
这些Linux工具可以用来解档那些用DOS下的arc.exe, arj.exe, 和rar.exe 程序进行归档的文件.
文件信息
5.13 file
确定文件类型的工具. 命令file file-name将会用ascii文本或数据的形式返回file-name文件的详细描述. 这个命令会使用/usr/share/magic, /etc/magic, 或/usr/lib/magic中定义的魔法数字来标识包含某种魔法数字的文件, 上边所举出的这3个文件需要依赖于具体的 Linux/UNIX 发行版.
-f选项将会让file命令运行于批处理模式, 也就是说它会分析-f后边所指定的文件, 从中读取需要处理的文件列表, 然后依次执行file命令. -z选项, 当对压缩过的目标文件使用时, 将会强制分析压缩的文件类型.
5.14 which which command-xxx将会给出"command-xxx"的完整路径. 当你想在系统中准确定位一个特定的命令或工具的时候, 这个命令就非常有用了.
$bash which rm /usr/bin/rm
5.15 whereis 与上边的which很相似, whereis command-xxx不只会给出"command-xxx"的完整路径, 而且还会给出这个命令的man页的完整路径.
$bash whereis rm rm: /bin/rm /usr/share/man/man1/rm.1.bz2
5.16 whatis
whatis filexxx将会在whatis数据库中查询"filexxx". 当你想确认系统命令和重要的配置文件的时候, 这个命令就非常重要了. 可以把这个命令认为是一个简单的man命令.
$bash whatis whatis whatis (1) - search the whatis database for complete words
5.17 vdir
显示详细的目录列表. 与ls -l的效果相似.
这是一个GNU fileutils.
5.18 locate, slocate
locate命令将会在预先建立好的档案数据库中查询文件. slocate命令是locate的安全版本(locate命令很有可能已经被关联到slocate命令上了).
$bash locate hickson /usr/lib/xephem/catalogs/hickson.edb
5.18 readlink
显示符号链接所指向的文件.
bash$ readlink /usr/bin/awk
../../bin/gawk
5.19 strings
使用strings命令在二进制或数据文件中找出可打印字符. 它将在目标文件中列出所有找到的可打印字符的序列. 这个命令对于想进行快速查找n个字符的打印检查来说是很方便的, 也可以用来检查一个未知格式的图片文件(strings image-file | more可能会搜索出像JFIF这样的字符串, 那么这就意味着这个文件是一个jpeg格式的图片文件). 在脚本中, 你可能会使用grep或者sed命令来分析strings命令的输出.
Comparison
5.20 diff, patch
diff: 一个非常灵活的文件比较工具. 这个工具将会以一行接一行的形式来比较目标文件. 在某些应用中, 比如说比较单词词典, 在通过管道将结果传递给diff命令之前, 使用诸如sort和uniq命令来对文件进行过滤将是非常有用的. diff file-1 file-2 将会输出两个文件中不同的行, 并会通过符号标识出每个不同行所属的文件.
diff命令的--side-by-side选项将会按照左右分隔的形式, 把两个比较中的文件全部输出, 并且会把不同的行标记出来. -c和-u选项也会使得diff命令的输出变得容易解释一些.
还有一些diff命令的变种, 比如sdiff, wdiff, xdiff, 和mgdiff.
如果比较的两个文件是完全一样的话, 那么diff命令会返回0作为退出状态码, 如果不同的话就返回1作为退出码. 这样diff命令就可以用在shell脚本的测试结构中了. (见下边).
diff命令的一个重要用法就是产生区别文件, 这个文件将用作patch命令的-e选项的参数, -e选项接受ed或ex脚本.
5.21 patch: 灵活的版本工具. 给出一个用diff命令产生的区别文件, patch命令可以将一个老版本的包更新为一个新版本的包. 因为你发布一个小的"区别"文件远比重新发布一个大的软件包来的容易得多. 对于频繁更新的Linux内核来说, 使用内核"补丁包"的形式来发布是一种非常好的办法.
1 patch -p1
2 # 在'patch-file'中取得所有的修改列表,
3 # 然后把它们更新到相应的文件中.
4 # 那么这个包就被更新为新版本了.
diff也可以递归的比较目录下的所有文件(包含子目录).
bash$ diff -r ~/notes1 ~/notes2
Only in /home/bozo/notes1: file02
Only in /home/bozo/notes1: file03
Only in /home/bozo/notes2: file04
使用zdiff来比较gzip文件.
5.22 diff3
这是diff命令的扩展版本, 可以同时比较三个文件. 如果成功执行那么这个命令就返回0, 但不幸的是这个命令不给出比较结果的信息.
bash$ diff3 file-1 file-2 file-3
5.23 sdiff
比较和(或)编辑两个文件, 将它们合并到一个输出文件中. 由于这个命令的交互特性, 所以在脚本中很少使用这个命令.
5.24 cmp
cmp命令是上边diff命令的一个简单版本. diff命令会报告两个文件的不同之处, 而cmp命令仅仅指出哪些位置有所不同, 不会显示不同之处的具体细节.
使用zcmp处理gzip文件.
5.25 comm 多功能的文件比较工具. 使用这个命令之前必须先排序.
comm -options first-file second-file
comm file-1 file-2 将会输出3列:
第1列 = 只在file-1中存在的行
第2列 = 只在file-2中存在的行
第3列 = 两边相同的行.
Utilities
5.26 basename
从文件名中去掉路径信息, 只打印出文件名. 结构basename $0可以让脚本获得它自己的名字, 也就是, 它被调用的名字. 可以用来显示"用法"信息, 比如如果你调用脚本的时候缺少参数, 可以使用如下语句: 1 echo "Usage: `basename $0` arg1 arg2 ... argn"
5.27 dirname
从带路径的文件名字符串中去掉文件名(basename), 只打印出路径信息.
basename和dirname可以操作任意字符串. 它们的参数不一定是一个真正存在的文件, 甚至可以不是一个文件名. (请参考例子 A-7).
5.28 split, csplit
将一个文件分割为几个小段的工具. 这些命令通常会将大的文件分割, 然后备份到软盘上, 或者是为了将大文件切成合适的尺寸, 然后用email上传.
csplit命令会根据上下文来切割文件, 切割的位置将会发生在模式匹配的地方.
5.29 sum, cksum, md5sum, sha1sum
这些都是用来产生checksum的工具. checksum是对文件的内容进行数学计算而得到的, 它的目的是用来检验文件的完整性, 出于安全目的一个脚本可能会有一个checksum列表, 这样可以确保关键系统文件的内容不会被修改或损坏. 对于需要安全性的应用来说, 应该使用md5sum (message digest 5 checksum)命令, 或者使用更好更新的sha1sum命令(安全Hash算法).
bash$ cksum /boot/vmlinuz
1670054224 804083 /boot/vmlinuz
bash$ echo -n "Top Secret" | cksum
3391003827 10
bash$ md5sum /boot/vmlinuz
0f43eccea8f09e0a0b2b5cf1dcf333ba /boot/vmlinuz
bash$ echo -n "Top Secret" | md5sum
8babc97a6f62a4649716f4df8d61728f -
cksum将会显示目标尺寸(以字节为单位), 目标可以是stdout, 也可以是文件.
md5sum和sha1sum命令在它们收到来自于stdout的输入的时候, 显示一个dash.
5.30 shred
用随机字符填充文件, 使得文件无法恢复, 这样就可以保证文件安全的被删除. 这个命令的效果与例子 12-55一样, 但是使用这个命令是一种更优雅更彻底的方法.
这是GNU的文件工具之一.
即使使用了shred命令, 高级的辨别技术也还是能够恢复文件的内容.
编码和解码
5.31 uuencode
这个工具用来把二进制文件编码成ASCII字符串, 这个工具适用于编码e-mail消息体, 或者新闻组消息.
uudecode
这个工具用来把uuencode后的ASCII字符串恢复为二进制文件.
5.32 fold -s命令在处理从Usenet新闻组下载下来的长的uudecode文本消息的时候可能会有用(可能在管道中).
5.33 mimencode, mmencode
mimencode和mmencode命令用来处理多媒体编码的email附件. 虽然mail用户代理(比如pine或kmail)通常情况下都会自动处理, 但是这些特定的工具允许从命令行或shell脚本中来手动操作这些附件.
5.34 crypt
这个工具曾经是标准的UNIX文件加密工具.
Miscellaneous
5.35 mktemp
使用一个"唯一"的文件名来创建一个临时文件.
5.36 make
build(建立)和compile(编译)二进制包的工具. 当源文件被增加或修改时就会触发一些操作, 这个工具用来控制这些操作.
make命令会检查Makefile, makefile是文件的依赖和操作列表.
5.37 install
特殊目的的文件拷贝命令, 与cp命令相似, 但是具有设置拷贝文件的权限和属性的能力. 这个命令看起来是为了安装软件包所定制的, 而且就其本身而言, 这个命令经常出现在Makefiles中(在make install : 区域中). 在安装脚本中也会看到这个命令的使用.
5.37 dos2unix
这个工具是由Benjamin Lin及其同事共同编写的, 目的是将DOS格式的文本文件(以CR-LF为行结束符)转换为UNIX格式(以LF为行结束符), 反过来也一样.
5.38 ptx
ptx [targetfile]命令将输出目标文件的序列改变索引(交叉引用列表). 如果必要的话, 这个命令可以在管道中进行更深层次的过滤和格式化.
5.39 more, less
分页显示文本文件或stdout, 一次一屏. 可以用来过滤stdout的输出 . . . 或过滤一个脚本的输出.
more命令的一个有趣的应用就是测试一个命令序列的执行, 这样做的目的是避免可能发生的糟糕的结果.