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 10:32
下一篇 2016-12-26 10:32

相关推荐

  • tcp socket文件句柄泄漏

    今天发现有台redis机器上出现socket个数告警,这是很奇怪的现象。因为一台redis服务器上就部署了几个redis实例,打开的端口应该是有限。 1、netstat显示的tcp连接数正常 netstat -n | awk '/^tcp/ {++state[$NF]} END …

    Linux干货 2016-04-13
  • select应用详解及rpm、yum使用说明

    一.select相关用法解析 1.select variable in list;do   变量不用加$,和for极为相似         循环体     done 2.    (1)sel…

    Linux干货 2016-08-29
  • 第八周-Linux网络配置,软件安装,bash编程

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别 网桥:一种网络设备,负责网络桥接(network bridging)之用。桥接器将网络的多个网段在数据链路层(OSI模型第2层)连接起来(即桥接)。 集线器(Hub):是指将多条以太网双绞线或光纤集合连接在同一段物理介质下的设备。集线器是运作在OSI模型中的物理层。 二层交换机:工…

    Linux干货 2016-11-14
  • PHP数组实际占用内存大小的分析

    我们在前面的php高效写法提到,尽量不要复制变量,特别是数组。一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。下面我们可以粗略的估算PHP数组占用内存的大小,首先我们测试1000个元素的整数占用的内存: <?php      &nb…

    系统运维 2015-05-28
  • 软件包管理、自建yum源与LAMP架构的自动编译安装

    软件包管理 CentOS采用RedHat开发的rpm包管理器管理应用程序包。rpm包是由二进制可执行程序、库、配置文件、帮助文件等组成,支持安装、卸载、查询、升级、降级、校验等操作。 从组成结构上,rpm包由文件清单、安装和卸载时运行的脚本构成。 包管理器有其自带的公共数据库。其数据包括:程序包的名称、版本、依赖关系,功能说明,及各个文件的路径及校验码信息等…

    Linux干货 2016-12-05
  • Linux文件查找

    什么是文件查找     在文件系统中查找符合条件的文件; 文件查找分为:     实时查找:遍历所有文件进行条件匹配(find)     非实时查找:根据索引查找(locate) locate  查询系统上预建的文件索引数据库 …

    Linux干货 2016-08-15

评论列表(1条)

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

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