unix-find命令详解

        由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统(NFS),find命令在该文件系统中同样有效,只你具有相应的权限。

在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

1.1.1  Find命令形式

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

1.1.2  Find命令参数

find命令选项options:

参数

说明

pathname

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

-print

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

-exec

find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为' command' {} \;,注意{ }和\;之间的空格。

-ok

和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

-name

按照文件名查找文件。

-perm

按照文件权限来查找文件。

-prune

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

-user

按照文件属主来查找文件。

-group

按照文件所属的组来查找文件。

-mtime

-mtime -n +n

按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。Find命令还有-atime和-ctime选项,但它们都和-mtime选项。

-nogroup

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

-nouser

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

-newer

-newer file1 ! file2

查找更改时间比文件file1新但比文件file2旧的文件。

-type

查找某一类型的文件。

b - 块设备文件。

d - 目录。

c - 字符设备文件。

p - 管道文件。

l - 符号链接文件。

f - 普通文件。

-size n[c]

查找文件长度为n块的文件,带有c时表示文件长度以字节计。

-depth

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

-fstype

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

-mount

在查找文件时不跨越文件系统mount点。

-follow

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

-cpio

对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

 

1.1.3  Find命令举例

1.1.3.1 name选项

文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。

可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。

不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为pathname参数,波浪号~代表了你的$HOME目录。

$ find ~ -name "*.txt" -print

 

想要在当前目录及子目录中查找所有的*.txt文件,可以用:

$ find . -name "*.txt" –print

 

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:

$ find . -name "[A-Z]*" –print

 

想要在/etc目录中查找文件名以host开头的文件,可以用:

$ find /etc -name "host*" -print

 

想要查找$HOME目录中的文件,可以用:

$ find ~ -name "*" -print 或find . -print

 

要想让系统高负荷运行,就从根目录开始查找所有的文件。

$ find / -name "*" -print

 

如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件:

$find . -name "[a-z][a-z][0--9][0--9].txt" -print

 

1.1.3.2 perm选项

按照文件权限模式用-perm选项。

按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

 

如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:

$ find . -perm 755 -print

 

还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666。

# ls -l

-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf

-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf

-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf

drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam

-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

 

# find . -perm 006

# find . -perm -006

./sam

./httpd1.conf

./temp

 

1.1.3.3 prune选项

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

 

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

$ find /apps -path "/apps/bin" -prune -o -print

 

-perm选项中,我的解析还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666。

 

使用find查找文件的时候怎么避开某个文件目录?

 

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

$find /usr/sam -path "/usr/sam/dir1" -prune -o -print 

 

find [path ..] [expression] 在路径列表的后面的是表达式

-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似。如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune ,与逻辑表达式为假。 如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print 返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。 

这个表达式组合特例可以用伪码写为

if -path "/usr/sam" then

   -prune

else

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值