《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知道文件名,允许它验证变更位置,并回复不匹配之处。