find命令用于搜索文件。其完整语法为:find [path] [options] [tests] [actions]
path是要搜索的路径,可以是绝对路径也可以是相对路径。
options有许多选项可用,以下列出一些主要的选项
选项 含义
-depth 在查看目录本身之前先搜索目录的内容
-follow 跟随符号链接
-maxdepths N 最多允许搜索N层目录
-mout(或-xdev) 不搜索其他文件系统中的目录
tests(测试)部分:可以提供给find命令的测试非常多,每种测试返回的结果有两种可能:true或false。find开始工作时候,它按照顺序将定义的每种测试依次应用到它搜索到的每个文件上。如果一个测试返回false,find命令就停止处理它当前找到的这个文件,并继续搜索。如果一个测试返回true,find命令将继续下一个测试或对当前文件采取行动。最常用的测试如下表:
测试 含义
-atime N 文件在N天之前被最后访问过
-mtime N 文件在N天之前被最后修改过
-name pattern 文件名(不包括路径名)匹配提供的模式pattern,为了确保 pattern被传递给find命令而不是shell来处理,pattern必须总是 用引号括起
-newer otherfile 文件比otherfile文件更新
-type c 文件的类型为c,c是一个特殊类型。最常见的是d(目录)和 f(普通文件)。
-user username 文件的拥有者是制定的用户username
可以用操作符来组合测试。大多数操作符有两种格式:短格式和长格式
操作符,短格式 操作符,长格式 含义
! -not 测试取反
-a -and 两个测试都必须为真
-o -or 两个测试有一个必须为真
还可以通过使用圆括号来强制测试和操作符的优先级。由于圆括号对于shell来说有其特殊含义,所以必须使用反斜线来引用圆括号。此外,如果你在文件名处使用的是匹配模式,你就必须在模式上使用引号以确保模式没有被shell扩展,而是直接传递给find命令。例如: “搜索的文件比文件X更新,或者文件名以下划线开头” \(-newer X -o -name “_*”\)
在发现匹配指定条件的文件之后,可以执行的最常用的动作:
动作 含义
-exec command 执行一条命令。这是最常见的动作之一。该动作必须使用\;字符对来 结束
-ok command 与-exec类似,但它在执行命令之前会针对每个要处理的文件,提示 用户进行确认。这个动作必须使用\;字符结束
-print 打印文件名
-ls 对当前文件使用命令 ls -dils
另外魔术字符串{}是-exec或-ok命令的一个特殊类型的参数,它将被当前文件的完整路径取代。
例:
$ find . -newer while2 -type f -exec ls -l {} \; 搜索比while2更新的且类型是普通文件的文件,搜索到时打印该文件的信息
grep命令 (通用正则表达式解析器)。使用grep命令可在文件中搜索字符串。一种非常常见的用法是在使用find命令时,将grep作为传递给-exec的一条命令。
grep命令使用一个选项、一个要匹配的模式和要搜索的文件,语法如下所示:
grep [options] PATTERN [FILES]
如果没有提供文件名,则grep命令将搜索标准输入。Grep命令的一些主要选项如下:
选项 含义
-c 输出匹配行的数目,而不是输出匹配的行
-E 启用扩展表达式
-h 取消每个输出行的普通前缀,即匹配查询模式的文件名
-i 忽略大小写
-l 只列出包含匹配行的文件名,而不输出真正的匹配行
-v 对匹配模式取反,即搜索不匹配行而不是匹配行
例如:
shmily@pc-Shmily:~/code/Shell$ grep '#' she_*
she_1:#!/bin/sh
she_10:#!/bin/sh
she_11:#!/bin/sh
shmily@pc-Shmily:~/code/Shell$ grep -c '#' she_*
she_1:1
she_10:1
she_11:1
shmily@pc-Shmily:~/code/Shell$ grep -c -v '#' she_*
she_1:15
she_10:18
she_11:3
正则表达式:在使用正则表达式的过程中,一些字符是以特定方式处理的。最常使用的特殊字符如下:
字符 含义
^ 指向一行的开头
$ 指向一行的结尾
. 任意单个字符
[] 方括号内包含一个字符范围,其中任何一个字符都可以被匹配,例 如字符范围a~e,或在字符范围前加上^符号表示使用反向字符范围, 即不匹配指定范围内的字符
如果想将上述字符用作普通字符,就需要在它们前面加上\字符。
在方括号中还可以使用一些有用的特殊匹配模式,如下表:
匹配模式 含义
[:alnum:] 字母与数字字符
[:alpha:] 字母
[:ascii:] ASCII字符
[:blank:] 空格或制表符
[:cntrl:] ASCII控制字符
[:digit:] 数字
[:graph:] 非控制、非空格字符
[:lower:] 小写字母
[:print:] 可打印字符
[:punct:] 标点符号字符
[:space:] 空白字符,包括垂直制表符
[:upper:] 大写字母
[:xdigit:] 十六进制数字
如果指定了用于扩展匹配的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式规则。对于grep命令来说,我们还需要在这些字符之前加上\字符。
选项 含义
? 匹配是可选的,最多匹配一次
* 必须匹配0次或多次
+ 必须匹配1次或多次
{n} 必须匹配n次
{n,} 必须匹配n次或n次以上
{n, m} 匹配次数在n到m之间,包括n和m
例:
grep e$ words2.txt 查找以字母e结尾的行
grep a[[:blank:]] word2.txt 查找以a结尾的单词
grep Th.[[:space:]] word2.txt 查找以Th开头的由3个字母组成的单词
grep -E [a-z]\{10\} word2.txt 查找只有10个字符长的全部由消协字母组成的单词