2011年12月23日星期五

《Classic Shell Scripting》:ls,locate,type,find,df,du,diff,patch

一.ls
"
语法
    ls [ options ] [ file(s) ]
用途
    列出文件目录的内容
主要选项
    -1 : 数字1.强制为单栏输出。在交互式模式下,ls一般会以适于当前窗口的最小宽度,使用多个列
    -a : 显示所有文件,包括隐藏文件(文件名以点号起始的文件)
    -d : 显示与目录本身相关的信息,而非它们包含的文件的信息。
    -F : 使用特殊结尾字符,标记特定的文件类型
    -g : 仅适用于组:省略所有者名称(隐含-l,小写L选项)
    -i : 列出inode编号
    -L : 紧接着符号性连接,列出它们指向的文件
    -l : 小写的L。以冗长形式列出,带有类型,权限保护,所有者,组,字节计数,最后修改时间和文件名
    -r : 倒置默认的排序顺序
    -R : 递归列出,下延进入每个子目录
    -S : 按照由大到小的文件大小计数排序。仅GNU版本支持
    -s : 以块(与系统有关)为单位,列出文件的大小
    -t : 按照最后修改时间戳排序
    --full-time : 显示完整的时间戳,仅GNU版本支持
"

二.locate
locate将文件系统里的所有文件名压缩成数据库,以迅速找到匹配类Shell通配字符的文件名,不必实际查找整个庞大的目录结构
locate gcc-3.3.tar
locate '*gcc-3.3*.tar*'

三.type
偶尔你也可能会想知道,调用一个没有路径的命令时,它在文件系统的位置如何。Bourne-Shell家族里的type命令可以告诉你:
type gcc             #gcc在哪?
type type            #type是什么?
请注意:type是Shell内置命令,所以它认得别名与函数。

四.find
假定你想选择大于某个大小的文件,或是三天前修改过,属于你的文件,或者拥有三个或三个以上直接链接的文件,就会需要UNIX工具集里最强力的find命令。
"
语法
    find [ files-or-directories ] [ options ]
用途
    寻找与指定名称模式匹配或具有给定属性的文件
主要选项
    -atime n : 选定n天前访问的文件
    -ctime n : 选定n天前改过inode的文件
    -follow : 接着符号性连接
    -group g : 选定组g内的文件(g为用户组ID名称或数字)
    -links n : 选定拥有n个直接链接的文件
    -ls : 产生类似ls冗长形式的列表,而不是只有文件名
    -mtime n : 选定n天前修改过的文件
    -name 'pattern' : 选定文件名与Shell通配字符模式匹配的文件(通配字符模会使用括号框起来,可避免Shell解释)
    -perm mask : 选定与指定八进制权限掩码匹配的文件
    -prune : 不向下递归到目录树状结构里
    -size n : 选择大小为n的文件
    -type t : 选定类型t的文件,类型是单一字母:d为目录,f为文件,l为符号性连接
    -user u : 选定用户u拥有的文件(u为用户ID名称或编号)
警告
    find输出的是未排序的结果
    find提供额外的选项,可对选定的文件执行任意操作。由于这是一个潜在的危险,我们不建议使用这类选项。
"

find不同于ls与Shell的地方是:它没有隐藏文件的概念,也就是说:就算是点号开头的文件名,find还是能找到它。
另一点不同于ls的是:find不排序文件名。它只是以它读到目录的顺序依次显示,事实上这个排序应是随机的。因此,你可能得在find命令后,通过管道加入sort步骤。

-size选项必须接上一个数字参数。默认值是以512字节为单位的大小,不过很多find实例,允许在数字之后加上c表示字符(字节),或k表示kilobyte(KB)。如果数字未带有正负号,则指的是必须确实匹配于该文件大小。如果为负,则只有小于该数字(绝对值)的文件大小是匹配的。否则,带有正号,则只有大于该容量的文件才匹配。-links,-atime,-ctime,-mtime选项类似。

五.df
df(disk free,磁盘可用空间)提供单行摘要,一行显示一个加载的文件系统的已使用的和可用的空间。大部分现代实现都支持-k选项,也就是强制使用kilobyte单位,以及-l(小写L)选项,仅显示本地文件系统,排除网络挂载的文件系统。

df的输出是未排序的。

六.du
df会摘要文件系统的可用空间,但它并不会告诉你某个特定的目录树需要多少空间,这是du(disk usage,磁盘用量)的工作。du就像df一样,有两个常见的选项实现:-k(kilobyte单位)与-s(摘要)。

du会针对每个文件或目录参数---如果无提供这类参数则为当前目录,产生一个输出行。

七.diff and patch
如果你想知道两个相似的文件有何不同,可使用diff。
使用diff的惯例是:将旧文件作为第一个参数。
有时,与diff系出同门的diff3也是相当好用的工具,它的任务与diff稍有不同:diff3比较的是三个文件,例如基本版与由两个不同的人所做出来的两个修改文件,它还会产生一个ed命令的脚本,让用户将两组修改文件合并到基本版里。

patch工具程序可利用diff的输出,结合原始文件,以重建另一个文件。因为相异的部分,通常比原始文件小很多,软件开发人员常会通过email交换相异处的列表,再使用patch应用它。
diff -c test.[12] > test.dif   #将相异处的相关内文,存储到test.dif
patch < test.dif               #应用不同之处
patch尽可能套用不同之处,然后报告失败的部分,由你自行手动处理。
虽然patch可使用diff的一般输出,但较通用的方式应是使用diff的-c选项,以取得上下文差异处。这么做会产生较详细冗长的报告,让patch知道文件名,允许它验证变更位置,并回复不匹配之处。

没有评论:

发表评论