假设用户的 C 程序中包含一些不必要的转向语句(goto 语句),想要找到这些语句,可以用 如下的命令来搜索并显示所有包含 goto 语句的代码行: $ grep goto *.c 用户可以在命令行上键入搜索模式,也可以使用-f 选项从指定文件中读取 要搜索的模式。在文件中,每个搜索模式占一行。如果经常要搜索一组常见字符 串 时,这个功能非常有用。在下面的例子中,用户要在文件 exam 中搜索字符串 “editor”和“create”, 就把要搜索的模式放置在文件 mypats 中, 然后, grep 命令从文件 mypats 中读取要搜索的模式。 $ cat mypats editor create $ grep -f mypats exam 文件查找命令 find 命令 功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的 查找条件,功能很强大。 语法:find 起始目录 寻找条件 操作 说明:find 命令从指定的起始目录开始,递归地搜索其各个子目录,查找 满足寻找条件的文件并对之采取相关的操作。 该命令提供的寻找条件可以是一个用逻辑运算符 not、and、or 组成的复合 条件。逻辑运算符 and、or、not 的含义为: (1)and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有 当所给的条件都满足时,寻找条件才算满足。例如: $ find ????ame ’tmp’ ????type c -user ’inin’ 该命令寻找三个给定条件都满足的所有文件。 (2)or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件 中有一个满足时,寻找条件就算满足。例如: $ find ????ame ’tmp’ ???? ????ame ’mina*’ 该命令查询文件名为’tmp’或是匹配’mina*’的所有文件。 (3)not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给 条件的文件。例如: $ find ! ????ame ’tmp’ 该命令查询文件名不是’tmp’的所有文件。 需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。 为了避免 Shell 本身对括号引起误解, 在话号前需要加转义字符“”来去除括号 的意义。 例:$ find (????ame ’tmp’ ????type c -user ’inin’ ) 寻找条件有以下选项: 首先,下列各个选项中的 n 值可以有三种输入方式,假设 n 为 20,则: +20 表示 20 以后(21,22,23 等) -20 表示 20 以前(19,18,17 等) 20 表示正好是 20 1. 以名称和文件属性查找。 - name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。 - lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内 可用通配符*、?、[ ]。 -gid n 查找属于 ID 号为 n 的用户组的所有文件。 -uid n 查找属于 ID 号为 n 的用户的所有文件。 -group ’字串’ 查找属于用户组名为所给字串的所有的文件。 -user ’字串’ 查找属于用户名为所给字串的所有的文件。 -empty 查找大小为 0 的目录或文件。 -path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。 -perm 权限 查找具有指定权限的文件和目录, 权限的表示可以如 711, 644。 -size n[bckw] 查找指定文件大小的文件,n 后面的字符表示单位,缺省 为 b,代表 512 字节的块。 -type x 查找类型为 x 的文件,x 为下列字符之一: b 块设备文件 c 字符设备文件 d 目录文件 p 命名管道(FIFO) f 普通文件 l 符号链接文件(symbolic links) s socket 文件 -xtype x 与-type 基本相同,但只查找符号链接文件。 2. 以时间为条件查找 - amin n 查找 n 分钟以前被访问过的所有文件。 - atime n 查找 n 天以前被访问过的所有文件。 - cmin n 查找 n 分钟以前文件状态被修改过的所有文件。 - ctime n 查找 n 天以前文件状态被修改过的所有文件。 - mmin n 查找 n 分钟以前文件内容被修改过的所有文件。 - mtime n 查找 n 天以前文件内容被修改过的所有文件。 3. 可执行的操作 - exec 命令名称 {} 对符合条件的文件执行所给的 Linux 命令,而不询问 用户是否需要执行该命令。{}表示命令的参数即为所找到的文件;命令的末尾必 须以“ ;”结束。 - ok 命令名称 { } 对符合条件的文件执行所给的 Linux 命令,与 exec 不 同的是,它会询问用户是否需要执行该命令。 - ls 详细列出所找到的所有文件。 - fprintf 文件名 将找到的文件名写入指定文件。 - print 在标准输出设备上显示查找出的文件名。 - printf 格式 格式的写法请参考有关 C 语言的书。 例 1:查找当前目录中所有以 main 开头的文件,并显示这些文件的内容。 $ find . - name ‘main*’ - exec more {} ; 例 2:删除当前目录下所有一周之内没有被访问过的 a .out 或*.o 文件。 $ find . (- name a.out - o - name ‘*.o’) > - atime +7 - exec rm {} ; 说明如下: 命令中的“.”表示当前目录,此时 find 将从当前目录开始,逐个在其子目 录中查找满足后面指定条件的文件。(和)表示括号(),其中的“”称为转义 符。之所以这样写是由于对 Shell 而言,(和)另有不同的含义,而不是这里的 用于组合条件的用途。 name a.out”是指要查找名为 a.out 的文件; name ““‘*.o’”是指要查找所有名字以 .o 结尾的文件。这两个- name 之间的- o 表 示逻辑或(or),即查找名字为 a.out 或名字以 .o 结尾的文件,find 在当前目 录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间是否在 7 天以前(条件-atime +7),若是,则对该文件执行命令 rm(- exec rm{ };)。 其中{ }代表当前查到的符合条件的文件名,;则是语法所要求的。上述命令中 第一行的最后一个是续行符。当命令太长而在一行写不下时,可输入一个,之后 系统将显示 一个>,指示用户继续输入命令。 locate 命令 locate 命令用于查找文件,它比 find 命令的搜索速度快,它需要一个数据 库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个 数据库后,就可以方便地来搜寻所需文件了。 该命令的一般形式为: locate 相关字 例如:查找相关字 issue $ locate issue /etc/issue /etc/issue.net /usr/man/man5/issue.5 /usr/man/man5/issue.net.5