全部博文(2065)
分类:
2009-12-24 08:57:37
Shell专题之使用find命令
[By:hkebao@126.com
Time:
本篇专题的主题是:学习使用find和xargs
查找某一特征的文件(例如文件权限、文件属性、文件长度、文件类型等)。通过使用find可以遍历目录甚至于整个文件系统来查找某些文件或目录。
即使系统中含有网络文件系统(NFS)通过使用find也是同样有效的。只要它具有一定的权限。
如果要搜索一个大的文件系统(
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命令遇到符号链接,就跟踪至链接所指向的文件。
可以单独使用这个选项,也可以与其他选项一起使用。可以使用某种文件名模式来匹配,记住要用引号将文件名模式引起来。
示例:不管当前路径是什么,如果想要在自己的根目录$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开头的文件。即指定了查找目录了!
如果想按照文件权限模式来查找文件的话就可以用此选项。使用八进制表示权限。4
2 1
示例:查找当前目录下文件权限为755的文件
find . -perm 755 –print
如果在查找文件时希望忽略某个目录,比如你可能知道某个目录没有你要查找的文件,那就可以使用-prune
选项来指出需要忽略的目录。如果你使用了-prune选项时要当心,因为如果你同时使用了-depth则前一个就会被find所忽略掉。
示例:如果希望在
/apps 目录下查找文件,但不希望在 /apps/bin 目录下查找,可以用:
$find /apps –name “/apps/bin” –prune –o –print
如果希望按照文件属主查找文件,可以给出相应的用户名。
示例:在当前目录下查找文件属主为root
的文件
$find . -user root –print -user 表示指定到的具体的属主用户是谁!
有的时候是为了查找属主账户已被删除的文件。可以使用-nouser
选项。
在当前目录下查找属于root组的文件可以用:
find . -group root –print -group 指定组名
可以带上mtime 选项。如果用df
查找发现磁盘空间不足了,就可能是某一个文件的长度在此期间增长迅速。这时就可以用这个选项查找这样的文件。
用减号 – 限定更改时间在距今n日以内的文件。用加号限定更改时间在距今N日以前的文件。
示例:find / -mtime -1 –print 查找在一日以内更改过的文件。
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
处理!
示例一、匹配$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 命令能够查找到匹配的文件,同时结合一下exec与xargs命令能够对匹配到的相关文件进行一些命令操作!