find命令用法详解

find

find命令是用于实现精确查找,实时查找指定目录下面的文件。在工作中常用。优点是:实时,精确。缺点是:比较占用系统资源,比较慢一点。
在总结find之前,先简单总结一下which,whereis,locate简单用法。他们都是用于查找和定位文件的命令。

1.which命令 查找命令的二进制文件位置

例如:
[root@dxlcentOS ~]# which id
/usr/bin/id
[root@dxlcentOS ~]# which cd
/usr/bin/cd

2.whereis 文件名字的查找

选项 -b,只查找二进制文件
-m 只查找使用手册路径下的文件

例如:
[root@dxlcentOS ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@dxlcentOS ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
查找文件名为passwd 的文件 默认情况下使用手册所在的章节都会查找出来。

3.locate 快速定位给定的文件名,也可以给定文件的部分名字。

常用选项:
-i 忽略大小写
-l 输出前几行,例如 -l 5 输出找到的结果前5行
-S 输出locate使用的数据库信息
-b 只匹配路径中基名
-c 只统计查到的符合条件文件数量
-r 使用正则表达式
locate的优点是速度非常快,但是不能实现精确查找,同时依赖于已建立的数据库/var/lib/mlocatel里面的数据进行查找,不用搜索硬盘,所有很快。但是当你新建文件时,数据库还没有更新,默认是每天自动执行执行一次更新,这时候locat是无法查到的,这时候需要手动执行updatedb更新即可。

例如:
[root@dxlcentOS ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/home/dxl/passwd
[root@dxlcentOS ~]# locate -S
数据库 /var/lib/mlocate/mlocate.db:
14,196 文件夹
82,472 文件
4,403,787 文件名中的字节数
2,007,138 字节用于存储数据库


find命令详解

功能:对文进行实时,精确查找。
用法:find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定查找范围,默认是当前工作目录下进行查找
查找条件:指定查找目标的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行;默认为找出指定路径下的所有文件。
处理动作:对查找出来的文件进行删除,移动等操作,默认为输出到屏幕上。

1.根据文件名查找:-name 可以支持glob风格文件名通配

用法:find 查找路径 -name 文件名
例如:

[root@dxlcentOS tmp]# find . -name “*.txt” 查找/tmp目录下所有的txt文件
./maxusers.txt
./we/dd1.txt
./we/dd2.txt
./we/dd3.txt

[root@dxlcentOS tmp]# find . -name “[A-Z]*” -print 查找当前目录及子目录中查找文件名以一个大写字母开头的文件
./man/man3/Git.3pm.gz
./man/man3/Git::I18N.3pm.gz

[root@dxlcentOS tmp]# find . -name “f*” 查找/tmp目录下以f开头的文件
./functions
./fenzu
./fenz

[root@dxlcentOS tmp]# find /usr -name “[a-z][0-9]” 查找/usr目录下以小写字母开头,后面跟数字0-9开头的文件
/usr/bin/m4
/usr/share/gcc-4.8.2/python/libstdcxx/v6

2.根据文件从属关系查找:

  • -user USERNAME:查找属主为指定用户的所有文件。

例如:查找/var目录下文件属主为centos用户的所有文件
[root@dxlcentOS tmp]# find /var -user centos
/var/spool/mail/centos

  • -group GRPNAME:查找属组为指定组的所有文件.

例如:查找 /home目录里面属组为nologin的文件
[root@dxlcentOS tmp]# find /home -group nologin -ls
6292165 0 drwx—— 2 nologin nologin 76 10月 20 20:55 /home/nologin
6292166 4 -rw-r–r– 1 nologin nologin 18 9月 7 00:25 /home

  • -uid UID:查找属主指定的UID的所有文件。

例如:查找/var目录下uid为48的文件
[root@dxlcentOS tmp]# find /var -uid 48 -ls
771874 0 drwx—— 2 apache apache 6 10月 12 01:17 /var/lib/dav
17148123 0 drwx—— 3 apache apache 19 10月 12 01:17 /var/cache/httpd

  • -gid GID:查找属组指定的GID的所有文件。

例如:查找/var目录下gid为91的文件
[root@dxlcentOS tmp]# find /var -gid 91 -ls
17133941 0 drwxr-xr-x 3 root tomcat 21 10月 13 10:30 /var/lib/tomcat
25354344 0 drwxrwxr-x 2 root tomcat 6 8月 7 12:32 /var/lib/tomcat/webapps

  • -nouser:查找没有属主的文件。

例如:查找/home目录里面没有属主的文件
[root@dxlcentOS tmp]# find /home -nouser
/home/mandriva
/home/mandriva/.bash_logout
/home/mandriva/.bash_profile
/home/mandriva/.bashrc

  • -nogroup:查找没有属组的文件。

例如:查找/tmp目录里面没有属组的文件
[root@dxlcentOS tmp]# find /tmp -nogroup -ls
16798173 0 -rw-r–r– 1 root 2050 0 10月 18 17:37 /tmp/fenz

3.根据文件的类型查找,常见的文件类型有如下

用法:find 查找路径 -type 文件类型
f: 普通文件
d: 目录文件
l:符号链接文件
b:块设备 文件
c:字符设备文件
p:管道文件
s:套接字文件

例如: 查找/dev目录下的所有块设备
[root@dxlcentOS tmp]# find /dev -type b
/dev/sda6
/dev/sda5
/dev/sda4

综合练习:

1、找出/tmp目录下属主为非root的所有文件;
[root@dxlcentOS tmp]# find . ! -user root -ls 方法一:用!号表示非
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we
[root@dxlcentOS tmp]# find . -not -user root -ls 方法2:加-not,表示非
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

2、找出/tmp目录下文件名中不包含fstab字符串的文件;

[root@dxlcentOS tmp]# find . -name “fstab” 先找出带fstab字符的文件
./fstab
./fstab222
[root@dxlcentOS tmp]# find . ! -name “fstab

3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
[root@dxlcentOS tmp]# find . ! -name “fstab” ! -user root -ls
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

组合条件:逻辑表达式
-a 与:前后条件要通时满足,find默认为这个选项
-o: 或者
!,-not:非

4.根据指定的文件的大小查找

-size  [+|-]指定文件的大小

常用单位有:k(千字节), M(兆字节), G(1024M字节)
1G=1024M=1024K
例如:我要在某目录查找并指定为10k的文件,有三种输入方式表示三种不同的查找结果
10k:查找到的结果为大于9k,小于或等10k的文件
-10k:查找大于0小于10k的文件
+10k:查找大于大于10k的文件

查找/var目录下,查找深度到 2级子目录,大于11k的文件
[root@dxlcentOS etc]# find /var -maxdepth 2   -size +11k  -type f  -exec ls -lh  {} \; 
-rw-r--r--. 1 root root 585K 10月 28 10:32 /var/log/lastlog
-rw-rw-r--. 1 root utmp 131K 10月 28 10:32 /var/log/wtmp
.........

5.根据时间戳查找:就是根据文件的修改时间,访问时间,文件属性改变时间来查找文件。

1.以“天”为单位:
find  查找目标   -atime  [+|-]n   

:[#, #-1)

-#:(#, 0]

 

000.png

000.png

“4” :4天前的那一天,表示查找第5天00:00到23.59分59秒创建的文档
“-4” :表示查找小于等于过去4天内的文档
“+4” :查找大于等于过去5天的文件

查找/var目录内过去4天内的修改过的文件
[root@dxlcentOS etc]# find  /var   -mtime  -4 -exec ls   -rlt {} \;           

以“分钟”为单位:
-amin
-mmin
-cmin

6.根据权限查找:

-perm  [/|-]mode
  • mode:精确权限匹配,按给出的权限进行精确查找
例如:
[root@dxlcentOS dir3]# find . -perm 646 -exec ls -l {} \;    
-rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
  • /mode:权限前加斜线,任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足,权限之间存在“或”关系。
例如:要查找权限位的其他人有写权限的文件,
[root@dxlcentOS dir3]# find . -perm /002 -exec ls -l {} \;   
-rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
-rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
[root@dxlcentOS dir3]# find . -perm /222 -exec ls -l {} \;  查找任何有写入权限的文件
总用量 0
-rw-r--rw-. 1 root root  0 10月 28 12:58 ddd.txt
drwxr-xr-x. 2 root root 38 10月 28 13:00 dir1
..........
说明:第一个实例/002,表示只对其他用户的权限位的写权限进行查找。
002就是不进行属主和属组的权限位进行查找的意思。
但是在centos6上面有区别,centos6上/002也可以用+002表示,centos7上面find不再使用+号。
centos6上/002表示任意权限位存在写入的都会找到
  • -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足,权限之间存在“与”关系。
例如
[root@dxlcentOS dir3]# find . -perm -664 -exec ls -l {} \;
-rw-rw-rw-. 1 root root 0 10月 28 12:58 ./ddd.txt

处理动作:对find查找出的的结果进行的一列处理,例如删除,复制等。

  • -print:输出至标准输出;默认的动作
  • -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
  • -delete:删除查找到的文件;
  • -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
  • ok COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
  • -exec COMMAND {} ; :对查找到的每个文件执行由COMMAND表示的命令;

注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
find | xargs COMMAND
xargs命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]就是将command 1的标准输出结果,通过管道|变成xargs的标准输入,然后xargs再将此标准输入变成参数,传给[command 2]。这样一来,通过xargs命令,我们便可以在管道后面使用那些不接收标准输入的命令了。例如[command 1]|xargs ls。

练习:

1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
[root@dxlcentOS dir3]# find /var -user root -group mail -ls
8446487 0 drwxrwxr-x 2 root mail 260 10月 29 11:48 /var/spool/mail
9436072 4 -rw——- 1 root mail 680 10月 29 11:48 /var/spool/mail/root

2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;

[root@dxlcentOS dir3]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls   
注意小括号前后的空格
[root@dxlcentOS dir3]# find /usr  -not  -user root -not  -user bin  -not -user hadoop  -ls

3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
~]# find /etc -mtime -7 -a -not ( -user root -o -user hadoop ) -ls
~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls

4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;
[root@dxlcentOS dir3]# find / ( -nouser -o -nogroup ) -atime -7 -ls
82 0 drwx—— 2 1006 distro 62 10月 3 17:35 /home/mandriva
4215538 0 drwx—— 2 we55 2050 76 10月 24 11:33 /home/we55
4215539 4 -rw-r–r– 1 we55 2050 18 9月 7 00:25 /home/we55/.bash_logout
……..

5、查找/etc目录下大于1M且类型为普通文件的所有文件;
~]# find /etc -size +1M -type f -exec ls -lh {} ;

6、查找/etc目录下所有用户都没有写权限的文件;
~]# find /etc -not -perm /222 -type f -ls

7、查找/etc目录至少有一类用户没有执行权限的文件;
~]# find /etc -not -perm -111 -type f -ls

8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
~]# find /etc -perm -113 -type f -ls

  1. ~] # find /test ! -name “test” -type d -prune -o -type f -name “*.txt” -print
    查找/test下的.txt的普通文件,不查找子目录。
  2. ~] # find . ! -name “.” -type d -prune -o -type f -print
    查找当前目录下的普通文件,不查找子目录。

-maxdepth<目录层级>:设置最大目录层级; -mindepth<目录层级>:设置最小目录层级,设定查找目标的目录查找层级,有利于加快查找速度。
例如:查找/etc一级目录下的所有txt文件,不查找子目录里面的文件。
-prune 排除指定某个不要进行查找的目录

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88120

(0)
N27_dxldengN27_dxldeng
上一篇 2017-10-29
下一篇 2017-10-29

相关推荐

  • Linux运维之磁盘管理

    ※磁盘管理 计算机是由五大组成部件:输入设备,输出设备,存储器,运算器,控制器,其中输入设备我们称之为I/O设备,如键盘,扫描器,运算器和控制称之为cpu,存储器如,内存,硬盘,优盘。计算机其实只需要内存和cpu其实已经可以完成工作了,但是内存属于随机存储设备,断电之后就丢失数据,所以我们就需要通过其他的辅助存储设备来弥补内存的不足,这些辅存我们称之为外存。…

    Linux干货 2016-08-27
  • N21沉舟15周作业

    1、总结sed和awk的详细用法; 2、删除/boot/grub/grub.conf文件中所有行的行首的空白字符; #  sed 's@^[[:space:]]@@' /boot/grub/grub.conf 3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字…

    Linux干货 2016-11-14
  • N26-第一周作业

    1.    计算机由以下几个部分组成:         a. CPU:中央处理器;主要由运算器和控制器组成            …

    Linux干货 2017-01-07
  • SRE管理职责简介

    读书笔记 摘要 SRE是Site Reliability Engineer的简称,从名字可以看出Google的SRE不只是做Operation方面的工作,更多是保障整个Google服务的稳定性。 SRE管理职责简介 监控系统 警报 工单 日志 应急事件处理 变更管理 预测需求和规划容量 资源部署 小结 监控系统 监控系统是 SRE 团队监控服务质量…

    Linux干货 2017-04-03
  • AMERICAN GIRL 2025 GIRL OF THE YEAR SUMMER MCKINNY

    Baby Boy Names You Will Love 2024 The report includes the change in popularity, and the database allows you to search by the name and the year. The list typically comes out in May …

    Linux干货 2025-05-08
  • Package Manager

    Package Manager Package 管理工具的分类 rpm yum Source Code Install 管理工具的分类 前段管理工具:Debian:debRedhat,Suse…:rpm 前端管理工具:Debian:apt-getRedhat:yum,dnf RPM RPM是什么?RPM全称是RPM Package Manager…

    2016-03-27

评论列表(1条)

  • N27_dxldeng
    N27_dxldeng 2017-11-07 16:51

    非常感谢老师后期对作业有错漏的地方批改修正。