find与grep命令简介及正则表达式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

find与grep命令简介及正则表达式写给大家看的Shell脚本编程入门教程索引

两个更为有用的命令和正则表达式

在我们开始学习新的Shell编程知识之前,我们先来看一下两个更为有用的两个命令,这两个命令虽然并不是Shell的一部分,但是在进行Shell编程时却会经常用到.随后我们会来看一下正则表达式.

find命令

我们先来看的是find命令.这个命令对于我们用来查找文件时是相当有用的,但是对于Linux新手来说却有一些难于使用,在一定程序是由于他所带的选项,测试,动作类型参数,而且一个参数的执行结果会影响接下来的参数.

在我们深入这些选项和参数之前,我们先来看一个非常简单的例子.假如在我们的机子上有一个文件wish.我们来进行这个操作时要以root身份来运行,这样就可以保证我们可以搜索整个机子:

#find/-name wish-print

/usr/bin/wish

#

正如我们可以想到的,他会打印出搜索到的结果.很简单,是不是?

然而,他却需要一定的时间来运行,因为他也会同时搜索网络上的Window机器上的磁盘.Linux机器会挂载大块的Window机器的文件系统.他也会同时那些位置,虽然我们知道我们要查找的文件位于Linux机器上.

这也正是第一个选项的用武之地.如果我们指定了-mount选项,我们就可以告诉find命令不要搜索挂载的目录.

#find/-mount-name wish-print

/usr/bin/wish

#

这样我们仍然可以搜索这个文件,但是这一次并没有搜索挂载的文件系统.

find命令的完整语法如下:

find[path][options][tests][actions]

path是一个很简单的部分:我们可以使用绝对路径,例如/bin,或者是使用相对路径,例如..如果我们需要我们还可以指定多个路径,例如find/var/home

主要的一些选项如下:

-depth在查看目录本身以前要先搜索目录中的内容

-follow跟随符号链接

-maxdepths N在搜索一个目录时至多搜索N层

-mount(或-xdev)不要搜索其他的文件系统

下面的是一些test的选项.我们可以为find命令指定大量的测试,并且每一个测试会返回真或是假.当find命令工作时,他会考查顺序查找到的文件,并且会在这个文件上按顺序进行他们所定义的测试.如果一个测试返回假,find命令会停止他当前正在考查的文件并继续进行下面的动作.我们在下表中列出的只是一些我们最常用到的测试,我们可以通过查看手册页得到我们可以利用find 命令使用的可能的扩展列表项.

-atime NN天以前访问的文件

-mtime NN天以前修改的文件

-name pattern除了路径,与指定的类型匹配的文件名.为了保证指定的类型传递给find命令而并不是立即被Shell赋值,指定的类型必须用引号进行引用.

-newer otherfile与otherfile文件相比要新的文件

-type CC类型的文件,而这里的C可以指定的一种类型.最常用的是d代表目录,而f是指普通的文件.对于其他的文件类型,我们可以查看手册页.

-user username指定的用户所拥有的文件

我们也可以使用运算符进行测试的组合.大多数的有两种格式:短格式和长格式.

!-not测试的反

-a-and所有的测试必须为真

-o-or测试中某一个为真

我们可以使用括号来强行改变测试和运算符的次序.因为这些对于Shell来说有着特殊的意义,所以我们也需要使用反斜线将他们作为一个整体进行引用.另外,如果我们为文件名指定了匹配类型,我们也必须用引号进行引用,这样就可以避免他们被Shell进行扩展,从而可以将他们直接传递给find命令.所以如果我们要写一个这样的测试,要查找比X文件要近或者是以一个范围开头的文件,我们要写成下面的形式:

1.\(-newer X-o-name"_*"\)

复制代码

现在我们要试着在当前的目录下查找最近修改日期比while2更近的文件,我们可以用下面的命令:

$find.-newer while2-print

.

./elif3

./words.txt

./words2.txt

./_trap

$

我们在上面所用的命令看起来似乎不错,但是我们却同时也搜索了当前的目录文件,而这并不是我们所希望的,我们所感兴趣只是常规文件.所以我们可以加上另外一个测试-type f:

$find.-newer while2-type f-print

./elif3

./words.txt

./words2.txt

./_trap

$

工作原理:

这些命令是如何进行工作的呢?我们指定find命令应该在当前的目录下进行查找(.),而我们所要查找的是比while2更新的文件(-newer while2),而且如果已经传递了测试,还要测试这个文件是否为一个常规文件(-type-f).最后,我们使用我们以前用过的动作,-print,仅仅是来验证我们所找到的文件.

下面我们要查找的文件或者是以下划线开头的或者是要比while2文件新的文件,但是也必须为一个常规文件.这个例子可以向我们展示如何来进行测试的组合:

$find.\(-name"_*"-or-newer while2\)-type f-print

./elif3

./words.txt

./words2.txt

./_break

./_if

./_set

./_shift

./_trap

./_unset

./_until

$

这时我们可以看到这并不是一件很难的事情,不是这样吗?我们必须转义圆括号,这样他就不会被Shell所保护,同时用引号引用*,这样他就可以直接传递给find命令了.

既然我们现在能够可靠的查找文件,下面我们就来看一下当我们查找指定的文件时我们可以进行的一些协作.我们要再一次强调,我们在这里所列出的只是一些最常用的选项,我们可以查看手册页得到全部的集合.

-exec command执行一个命令.这是我们最常执行的动作.

相关文档
最新文档