find 详解

find 命令基本用法:

        find pathname [opotions] [-print | -exec | -ok …]

1、find 基本参数:

        pathname :find命令所查找的目录路径。(默认当前目录路径)    

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

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

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

2、opotions的基本选项 :

        -name 

        按照文件名查找文件,支持元字符通配。

        -iname

         按照文件名查找文件,支持元字符通配,忽略大小写。

        -perm

                -perm mode   表示精确匹配mode

                -perm /mode  表示属组属组其他中任意一个组别任意一权限位匹配,即至少有一个满足mode即满足

                -perm -mode  表示属主属组其他中都需要满足mode
        -prune
        使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

        -user
        按照文件属主来查找文件。
        -group
        按照文件所属的组来查找文件。
        -mtime -n +n
        按照文件的更改时间来查找文件, – n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-mtime选项一样。
        -nogroup
        查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
        -nouser
        查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
        -newer file1 ! file2
        查找更改时间比文件file1新但比文件file2旧的文件。
        -type
        查找某一类型的文件,诸如:
            b – 块设备文件。
            d – 目录。
            c – 字符设备文件。
            p – 管道文件。
            l – 符号链接文件。
            f – 普通文件。
        -size -n(k,m,g) +n(k,m,g)

         -n查找文件比n小的文件,+n查找文件比n大的文件,c为字节。

        -depth    

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

        -maxdepth

        在查找文件时,定义查找当前目录下的几级目录。
        -follow

        如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
 3、使用exec或ok来执行shell命令:

例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:

~]# find . -type f -exec ls -l {} \; 
总用量 60
-rw-r--r--. 1 root root 1034 11月 17 13:47 fastcgi.conf
-rw-r--r--. 1 root root 1034 11月 17 13:47 fastcgi.conf.default
-rw-r--r--. 1 root root  964 11月 17 13:47 fastcgi_params

例如:在/logs目录中查找更改时间在5日以前的文件并删除它们:

~]# find . -type f -mtime +7 -exec rm {} \;  #会发现没有任何提示我们就删除了
~]# find . -type f -mtime +7 -ok rm {} \;   #交互式的确认是否执行后面的command

4、例子:

1、使用name选项

想要在当前目录及子目录中查找不区分'*.txt' 文件,可以用:

$ find . -iname "*.txt"

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

$ find . -name "*.txt"

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

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

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

$ find / -name "*" -print

2、用perm选项

按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

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

$ find . -perm 755

还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-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

-perm mode:文件许可正好符合mode

-perm +mode:文件许可部分符合mode

-perm -mode: 文件许可完全符合mode

3、忽略某个目录

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

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

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

4、使用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

-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

-print

避开多个文件夹

find /usr/sam ( -path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -print

圆括号表示表达式的结合。

表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。

查找某一确定文件,-name等选项加在-o 之后

#find /usr/sam (-path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -name "temp" -print

5、使用user和nouser选项

按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:

$ find ~ -user sam -print

在/etc目录下查找文件属主为uucp的文件:

$ find /etc -user uucp -print

为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。

例如,希望在/home目录下查找所有的这类文件,可以用:

$ find /home -nouser -print

6、使用group和nogroup选项

就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:

$ find /apps -group gem -print

要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件

$ find / -nogroup -print

7、按照更改时间或访问时间等查找文件

如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。

用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。

希望在系统根目录下查找更改时间在5日以内的文件,可以用:

$ find / -mtime -5 -print

为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:

$ find /var/adm -mtime +3 -print

8、查找比某个文件新或旧的文件

如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:

newest_file_name ! oldest_file_name

其中,!是逻辑非符号。

查找更改时间比文件sam新但比文件temp旧的文件:

例:有两个文件

-rw-r–r– 1 sam adm 0 10月 31 01:07 fiel

-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 -newer httpd1.conf ! -newer temp -ls

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

1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp

1077673 0 -rw-r–r– 1 sam adm 0 10月 31 01:07 ./fiel

查找更改时间在比temp文件新的文件:

$ find . -newer temp -print

9、使用type选项

在/etc目录下查找所有的目录,可以用:

$ find /etc -type d -print

在当前目录下查找除目录以外的所有类型的文件,可以用:

$ find . ! -type d -print | find . -not -type d

在/etc目录下查找所有的符号链接文件,可以用

$ find /etc -type l -print

10、使用size选项

可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。

在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。

在当前目录下查找文件长度大于1 M字节的文件:

$ find . -size +1m -print

在/home/apache目录下查找文件长度恰好为100字节的文件:

$ find /home/apache -size 100c -print

在当前目录下查找长度超过10块的文件(一块等于512字节):

$ find . -size +10 -print

11、使用depth选项

在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。

在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。

它将首先匹配所有的文件然后再进入子目录中查找。

$ find / -name "CON.FILE" -depth -print

原创文章,作者:N25_随心,如若转载,请注明出处:http://www.178linux.com/64465

(0)
N25_随心N25_随心
上一篇 2016-12-26
下一篇 2016-12-26

相关推荐

  • N22+北京zhangzhangzhang+第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 cp -r /etc/skel /home/tuser1    ls -ld /home/tuser1   &nb…

    Linux干货 2016-09-05
  • 马哥教育网络班21期-第九周课程练习

    "1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash # declare -i login_user=0 declare -i nologin_user=0 whil…

    Linux干货 2016-09-15
  • 第十二周作业

    1、 请描述一次完整的http请求处理过程;  HTTP:超文本传输协议 完整的http请求过程 1)、建立TCP/IP连接:经过3次握手,建立连接或拒绝。 2)、浏览器向服务器发送HTTP请求。 3)、浏览器发送请求头信息。 4)、服务器应答:服务器接受请求后,会回送应答。 5)、服务器发送应答头信息。 6)、服务器向浏览器发送数据。 7)、服务…

    2017-05-17
  • 马哥教育网络班21期-第6周课程练习

    第6周课程练习 请详细总结vim编辑器的使用并完成以下练习题   1、         复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; # cp /etc/rc.d/rc.s…

    Linux干货 2016-08-30
  • diy自己的linux

    准备一台liunx的机器,我用的是liunx虚拟机,Centos6.8的镜像。 单独加载一块硬盘,我加载了一块20G的硬盘,然后用fdisk /dev/sdb进行分区,sdb1用来作为将来系统的/boot分区,所有100M就可以了,sdb2用来作为将来系统的/分区,我给了10G。然后将两个分区格式化为ext4系统。 mkdir /mnt/boot mkdir…

    Linux干货 2016-09-13
  • linux 下的文件压缩与解压

    文件压缩 压缩原理:把文件的二进制代码压缩,把相邻的0,1代码减少,比如有000000,可以把它变成6个0 的写法60,来减少该文件的空间。 目的:时间换空间,cpu时间–>空间 压缩文件工具:    compress|uncompress 压缩后的文件.z    gzip|gunzip  …

    Linux干货 2016-08-21

评论列表(1条)

  • 马哥教育
    马哥教育 2017-03-15 01:53

    赞,非常详细的总结了find相关的用法,比较不错~继续加油!