Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26188127
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类:

2009-12-24 08:57:37

Shell专题之使用find命令

[By:hkebao@126.com  Time:2009-12-20]

本篇专题的主题是:学习使用findxargs

查找某一特征的文件(例如文件权限、文件属性、文件长度、文件类型等)。通过使用find可以遍历目录甚至于整个文件系统来查找某些文件或目录。

即使系统中含有网络文件系统(NFS)通过使用find也是同样有效的。只要它具有一定的权限。

如果要搜索一个大的文件系统(30G字节以上的文件系统)速度是比较慢的!

Find命令的一般形式:

find  pathname –options  [-print –exec  -ok]

pathname          find命令所查找的目录路径。例如用 . 来表示当前目录,用 / 来表示系统根目录。

-print                  find命令将匹配的文件输出到标准输出。

-exec                            find命令对匹配的文件执行该参数所给出的shell命令。

-ok                      -exec的作用相同,只不过以一种更安全的模式来执行该参数所给出的shell命令。

在执行每一个命令之前都会给出提示,让用户来确定是否执行。

2.1 find命令选项

每一个选项前面跟随一个横杠

-name        按照文件名查找文件

-perm        按照文件权限来查找文件

-prune       可以使find命令不在当前指定的目录中查找,如果同时使用了-depth那将被find忽略。

-user                   按照文件属主来查找文件

-group       按照文件所属的组来查找文件

-mtime –n +n 按照文件的更改时间来查找文件,-n 表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。

-nogroup   查找无有效所属组的文件,即该文件所属的组在 /etc/groups 中不存在

-nouser     查找无有效属主的文件。即该文件的属主在 /etc/passwd中不存在

-newer file 1! File2    查找更改时间比该文件file1新但比该文件file2旧的该文件

-type          查找某一类型的该文件。诸如:

b-      块设备文件

d-      目录

c-      字符设备文件

p-      管道文件

l-       符号链接文件

f-       普通文件

-size n[c]   查找文件长度为n块的该文件,带有c时表示该文件长度以字节计

-depth  在查找该文件时首先查找当前目录中的该文件,然后再在其子目录中查找

-fstype       查找位于某一类型该文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab 中找到,该配置该文件中包含了本系统中有关该文件系统的信息。

-mount      在查找文件时不跨越该文件系统mount

-follow       如果find命令遇到符号链接,就跟踪至链接所指向的文件。

 

2.1.1 使用name选项

可以单独使用这个选项,也可以与其他选项一起使用。可以使用某种文件名模式来匹配,记住要用引号将文件名模式引起来。

示例:不管当前路径是什么,如果想要在自己的根目录$home 中查找文件名符合 *.txt  该文件使用

~ 作为’pathname’ 参数,波浪号~代表了你的$home目录。

find  -name "*.txt" –print    表示在当前目录及其子目录下面去搜索全部 txt结尾的文件并打印出来

find ~ -name "*.txt" –print    表示在用户的$HOME目录下面去查找符合条件的文件出来!

find . -name "[A-Z]*" –print   表示在当前目录下面查找以一个大写字母开头的文件。

find /etc -name "host*" –print  表示在 /etc目录下面查找文件名以 host开头的文件。即指定了查找目录了!

2.1.2 使用perm选项

如果想按照文件权限模式来查找文件的话就可以用此选项。使用八进制表示权限。4 2 1

示例:查找当前目录下文件权限为755的文件

find . -perm 755 –print

2.1.3 忽略某个目录

如果在查找文件时希望忽略某个目录,比如你可能知道某个目录没有你要查找的文件,那就可以使用-prune 选项来指出需要忽略的目录。如果你使用了-prune选项时要当心,因为如果你同时使用了-depth则前一个就会被find所忽略掉。

示例:如果希望在 /apps 目录下查找文件,但不希望在 /apps/bin 目录下查找,可以用:

$find /apps –name “/apps/bin” –prune –o –print

 

2.1.4 使用usernouser选项

如果希望按照文件属主查找文件,可以给出相应的用户名。

示例:在当前目录下查找文件属主为root 的文件

$find . -user root –print              -user  表示指定到的具体的属主用户是谁!

有的时候是为了查找属主账户已被删除的文件。可以使用-nouser 选项。

2.1.5 使用groupnogroup选项

在当前目录下查找属于root组的文件可以用:

find . -group root –print                    -group 指定组名

2.1.6 按照更改时间查找文件

可以带上mtime 选项。如果用df 查找发现磁盘空间不足了,就可能是某一个文件的长度在此期间增长迅速。这时就可以用这个选项查找这样的文件。

用减号 限定更改时间在距今n日以内的文件。用加号限定更改时间在距今N日以前的文件。

示例:find / -mtime -1 –print   查找在一日以内更改过的文件。

2.1.7 查找比某个文件新或旧的文件

 

2.1.11      使用mount选项

在当前的文件系统中查找文件

find . -name "*.XC" -mount –print              不会进入到其他的文件系统。即挂载的文件

 

2.1.12      使用exec ok来执行 shell命令

找到所匹配的文件之后要执行一些命令。

exec  命令  {}  \ ;

示例:find . type f -exec ls -l {} \;       看一下exec后面的选项。

示例:为了在/logs目录中查找更改时间在5日以前的文件并删除它们,可以用:

find  logs –type f –mtime +5 –exec rm {} \;

如果想要实现删除操作的话可以使用其安全模式命令。即在每一个删除操作之前提示一下。具体的命令如下

示例:在当前目录中查找所有文件名以。Log结尾、更改时间在5日以上的文件,并删除掉它们

find  . –name “*.log” –mtime +5 –ok rm {} \;

这样的话就会提示每一个删除动作的!

示例:首先匹配所有文件名为”passwd*” 的文件,例如passwd passwd.old  passwd.bak ,然后执行grep命令看看在这些文件中是否存在一个rounder用户!

find /etc –name “passwd*” –exec grep “rounder” {} \;

即我们现在的命令是使用了grep 处理!

 

2.1.14 find 命令的例子

示例一、匹配$HOME目录下的所有文件

Find $HOME –print

Find ~ -print

示例二、在当前目录中查找suid 置位,文件属主具有读、写、执行权限,并且文件所属组的用户和其他用户具有读和执行的权限的文件,可以用:

Find . –type f –perm 4755 –print

示例三、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径。可以用

Find / -type f –size 0 –exec ls –l {} \;

能够查找到长度为0的文件。

示例四、为了查找/var/logs 目录中更改时间在7日以前的普通文件,并删除它们。

Find /var/logs –type f –mtime +7 –exec rm {} \;

示例五、为了查找系统中所有属于audit组的文件,可以用:

find /var/log/ -group root –print                     因为我的系统中没有audit 组所以我就用了root 组!

示例六、为了查找当前文件系统中的所有目录并排序,可以用:

find . -type d -print -mount | sort            哦原来 带上参数-type d 表示查找的类型为目录

上面写的像-type f 表示的是查找的类型为文件!

2.2 xargs

在我们使用find 命令的时候是将全部匹配到的文件一起传递给exec去执行了。有些系统对能够传递给exec的命令长度有限制。有些系统对传递给exec的命令长度有限制(比如说一次将全部的文件查出来肯定会有超过长度限制的)。这样的话在find命令运行之后就会出现溢出错误。此时就需要使用xargs命令!

下面介绍一下如何通过使用xargs命令与find 命令一起使用

find . -type f -print | xargs file

示例二、我们用grep 命令在所有的普通文件中搜索device这个词

find / -type f -print | xargs grep "device"        会搜索全部的普通文件!

通过find 命令能够查找到匹配的文件,同时结合一下execxargs命令能够对匹配到的相关文件进行一些命令操作!

 

阅读(832) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~