文章目录
find是linux系统中的一种 实时查找工具,通过 遍历指定起始路径下文件系统层级结构完成对文件的查找。
find命令的这种查找机制决定了它的一些工作特性:
- 查找速度略慢(只是略慢)
- 精准查找
- 实时查找
名称及简要说明
find - search for files in a directory hierarchy
find - 在一个目录层级中查找文件
用法格式简要说明
[OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径
查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
查找条件
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行;默认为找出指定路径下的所有文件;
根据文件名查找
-name
- -name “pattern”:查找符合“parrtern”模式的文件
#-name示例
[root@centos7u6 ~]# find /etc/ -name fstab
/etc/fstab
[root@centos7u6 ~]# find /etc/ -name fstab1
[root@centos7u6 ~]#
- -iname “pattern”:方法同 -name,但是不区分大小写
#-iname示例,为了显示效果,预先/tmp目录下创建了测试文件
[root@centos7u6 ~]# find /tmp/ -name "fstab"
/tmp/fstab
[root@centos7u6 ~]# find /tmp/ -iname "fstab"
/tmp/fstab
/tmp/Fstab
/tmp/FSTAB
其中,parrtern支持glob风格的通配符:*, ?, [], [^]等,而不是正则表达式。
- -regex pattern:基于正则表达式模式查找文件,匹配范围是整个路径,而非基名(不常用)
根据文件从属关系查找
-user
- -user USERNAME:查找属主为某指定用户的所有文件;
#-user示例,已预先创建好测试用户
[root@centos7u6 ~]# ls -l /tmp/
-rw-rw-r--. 1 test test 0 Mar 27 16:19 test
-rw-rw-r--. 1 user3 user3 0 Mar 27 16:20 user3
-rw-rw-r--. 1 user4 user4 0 Mar 28 00:43 user4
[root@centos7u6 ~]# find /tmp/ -user test
/tmp/test
-group
- -group GRPNAME:查找属组为某指定组的所有文件;
#-group示例
[root@centos7u6 ~]# ls -l /tmp/
total 12
-rw-r--r--. 1 user3 user3 465 Mar 27 16:20 fstab
-rw-r--r--. 1 root root 465 Mar 28 00:33 Fstab
-rw-r--r--. 1 root root 465 Mar 28 00:33 FSTAB
-rw-rw-r--. 1 test test 0 Mar 27 16:19 test
-rw-rw-r--. 1 user3 user3 0 Mar 27 16:20 user3
-rw-rw-r--. 1 user4 user4 0 Mar 28 00:43 user4
[root@centos7u6 ~]# find /tmp/ -group user3
/tmp/fstab
/tmp/user3
-uid
- -uid UID:查找属主为某指定的UID的所有文件;
#-uid示例,实验环境同上,先确认一下几个测试用户的uid
[root@centos7u6 ~]# tail -4 /etc/passwd
test:x:1000:1000:test:/home/test:/bin/bash
user3:x:1001:1001::/home/user3:/bin/bash
user4:x:1002:1002::/home/user4:/bin/bash
user5:x:1003:1003::/home/user5:/bin/bash
[root@centos7u6 ~]# find /tmp/ -uid 1002
/tmp/user4
[root@centos7u6 ~]#
-gid
- -gid GID:查找属组为某指定的GID的所有文件;
#-gid示例,实验环境同上
[root@centos7u6 ~]# find /tmp/ -gid 1000
/tmp/test
-nouser
- -nouser:查找没有属主的文件;
#实验环境同上,先删除测试用户user3
[root@centos7u6 ~]# userdel -r user3
[root@centos7u6 ~]# ll /tmp/
total 12
-rw-r--r--. 1 1001 1001 465 Mar 27 16:20 fstab
-rw-r--r--. 1 root root 465 Mar 28 00:33 Fstab
-rw-r--r--. 1 root root 465 Mar 28 00:33 FSTAB
-rw-rw-r--. 1 test test 0 Mar 27 16:19 test
-rw-rw-r--. 1 1001 1001 0 Mar 27 16:20 user3
-rw-rw-r--. 1 user4 user4 0 Mar 28 00:43 user4
#-nouser示例
[root@centos7u6 ~]# find /tmp/ -nouser
/tmp/fstab
/tmp/user3
-nogroup
- -nogroup:查找没有属组的文件;
#-nogroup示例,实验环境同上
[root@centos7u6 ~]# find /tmp/ -nogroup
/tmp/fstab
/tmp/user3
根据文件的类型查找
-type TYPE
- f: 查找普通文件,包括隐藏文件,默认为当前目录
#-type f示例
[root@centos7u6 ~]# ls
anaconda-ks.cfg test
[root@centos7u6 ~]# find -type f
./.bash_logout
./.bash_profile
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./.bash_history
./.bashrc
./test/fstab
./test/fstab.new
./test/fstab.patch
./test/myfirst.sh
./test/mysecond.sh
- d: 查找目录文件,查找结果包括目录本身
#-type d示例
[root@centos7u6 ~]# find /dev/ -type d |head -5
/dev/
/dev/vfio
/dev/net
/dev/snd
/dev/hugepages
[root@centos7u6 ~]#
- l:符号链接文件
#-type l示例
[root@centos7u6 dev]# find /dev/ -type l |head -2
/dev/cdrom
/dev/initctl
[root@centos7u6 dev]#
- b:块设备 文件
#-type b示例
[root@centos7u6 dev]# find /dev/ -type b
/dev/dm-1
/dev/dm-0
/dev/sr0
/dev/sda2
/dev/sda1
/dev/sda
- c:字符设备文件
#-type c示例,由于/dev/下有很多字符设备,这里使用tail命令截取2个显示
[root@centos7u6 dev]# find /dev/ -type c |tail -2
/dev/mem
/dev/vga_arbiter
- p:管道文件
#-type p示例,命令最后的-ls为处理命令,相当对查找到文件进行ls -l操作
[root@centos7u6 dev]# find /run/ -type p -ls
21651 0 prw------- 1 root root 0 Mar 27 22:14 /run/dmeventd-client
21650 0 prw------- 1 root root 0 Mar 27 22:14 /run/dmeventd-server
36668 0 prw------- 1 root root 0 Mar 27 22:14 /run/systemd/inhibit/1.ref
50539 0 prw------- 1 root root 0 Mar 28 09:04 /run/systemd/sessions/6.ref
39251 0 prw------- 1 root root 0 Mar 27 22:15 /run/systemd/sessions/1.ref
21646 0 prw------- 1 root root 0 Mar 27 22:14 /run/systemd/initctl/fifo
[root@centos7u6 dev]#
- s:套接字文件
#-type s示例
[root@centos7u6 dev]# find /run/systemd/ -type s -ls
21649 0 srw------- 1 root root 0 Mar 27 22:14 /run/systemd/shutdownd
21470 0 srwxrwxrwx 1 root root 0 Mar 27 22:14 /run/systemd/private
9003 0 srw-rw-rw- 1 root root 0 Mar 27 22:14 /run/systemd/journal/socket
9001 0 srw-rw-rw- 1 root root 0 Mar 27 22:14 /run/systemd/journal/stdout
8982 0 srwx------ 1 root root 0 Mar 27 22:14 /run/systemd/cgroups-agent
8980 0 srwxrwxrwx 1 root root 0 Mar 27 22:14 /run/systemd/notify
根据文件的大小查找
-size
- -size [+|-]#UNIT
UNIT常用单位:k, M, G
#UNIT:(#-1, #]
#-size 9k示例,可以看到查询到的文件大小在8k-9k之间
[root@centos7u6 log]# find /var/log/ -size 9k |xargs ls -lh
-rw-------. 1 root root 8.1K Mar 28 10:36 /var/log/boot.log-20190328
-rw-r--r--. 1 root root 8.5K Mar 28 09:04 /var/log/vmware-vmsvc.log
-#UNIT:[0,#-1]
#-size 2k示例,查找到的文件大小为小于等于1k,包括0k
[root@centos7u6 log]# find /var/log/ -size -2k -ls
16841389 0 -rw------- 1 root root 0 Mar 13 12:16 /var/log/tallylog
16909558 4 -rw-r--r-- 1 root root 193 Mar 13 12:16 /var/log/grubby_prune_debug
33886056 0 drwxr-xr-x 2 root root 23 Mar 13 13:44 /var/log/tuned
17137903 0 drwx------ 2 root root 23 Mar 13 13:44 /var/log/audit
70 0 drwxr-xr-x 2 root root 176 Mar 13 12:22 /var/log/anaconda
998730 0 -rw------- 1 root root 0 Mar 13 12:22 /var/log/anaconda/ks-script-dfZNA7.log
16960223 0 drwxr-xr-x 2 root root 6 Mar 13 12:22 /var/log/rhsm
17111828 0 -rw------- 1 root root 0 Mar 28 10:36 /var/log/boot.log
17111837 0 -rw-r--r-- 1 root root 0 Mar 13 13:44 /var/log/firewalld
16777697 4 -rw------- 1 root root 124 Mar 27 14:14 /var/log/yum.log
17138403 0 -rw------- 1 root root 0 Mar 13 12:17 /var/log/spooler-20190327
16777742 0 -rw------- 1 root root 0 Mar 27 10:12 /var/log/spooler
17111836 4 -rw-r--r-- 1 root root 678 Mar 13 13:44 /var/log/vmware-network.8.log
17111846 4 -rw-r--r-- 1 root root 700 Mar 13 16:44 /var/log/vmware-network.7.log
17111842 4 -rw-r--r-- 1 root root 678 Mar 25 21:48 /var/log/vmware-network.6.log
16777289 4 -rw-r--r-- 1 root root 700 Mar 25 23:39 /var/log/vmware-network.5.log
17111835 4 -rw-r--r-- 1 root root 678 Mar 26 22:41 /var/log/vmware-network.4.log
16777757 4 -rw-r--r-- 1 root root 678 Mar 27 22:14 /var/log/vmware-network.2.log
[root@centos7u6 log]#
+#UNIT:(#, oo)
#-size +300k示例,可以看到+300k,无法查找到大小正好为300k的文件
[root@centos7u6 log]# dd if=/dev/zero of=/var/log/300k.testfile bs=300k count=1
1+0 records in
1+0 records out
307200 bytes (307 kB) copied, 0.000866204 s, 355 MB/s
[root@centos7u6 log]# ll -l /var/log/300k.testfile
-rw-r--r--. 1 root root 307200 Mar 28 18:36 /var/log/300k.testfile
[root@centos7u6 log]# ll -lh /var/log/300k.testfile
-rw-r--r--. 1 root root 300K Mar 28 18:36 /var/log/300k.testfile
[root@centos7u6 log]# find /var/log/ -size +300k |xargs ls -lh
-rw-------. 1 root root 1.4M Mar 13 12:22 /var/log/anaconda/journal.log
-rw-------. 1 root root 323K Mar 28 18:01 /var/log/audit/audit.log
-rw-------. 1 root root 395K Mar 27 10:01 /var/log/messages-20190327
根据时间戳查找
-atime
- 以“天”为单位:
-atime [+|-]#
#:[#, #-1)
-#:(#, 0]
+#:(oo, #-1]
#-atime 1示例,命令查找结果为距离当前系统时间,24<=$date<48小时,被访问过的文件
[root@centos7u6 log]# date
Thu Mar 28 19:36:50 CST 2019
-rw-r--r--. 1 root root 5.7K Mar 27 22:14 tuned.log
[root@centos7u6 log]# find /var/log/ -atime 1 |xargs ls -lh
-rw-------. 1 root root 25K Mar 27 10:12 /var/log/boot.log-20190327
-rw-------. 1 root root 5.9K Mar 28 19:01 /var/log/cron
-rw-r--r--. 1 root root 120K Mar 26 22:41 /var/log/dmesg.old
-rw-------. 1 root root 107K Mar 28 09:03 /var/log/maillog
-rw-------. 1 root root 136K Mar 28 19:01 /var/log/messages
-rw-------. 1 root root 4.1K Mar 28 09:04 /var/log/secure
-rw-------. 1 root root 0 Mar 27 10:12 /var/log/spooler
-rw-r--r--. 1 root root 4.1K Mar 27 09:22 /var/log/vmware-network.3.log
-rw-r--r--. 1 root root 678 Mar 26 22:41 /var/log/vmware-network.4.log
-rw-------. 1 root root 124 Mar 27 14:14 /var/log/yum.log
#-atime +7示例,查找大于7天没被访问过的文件
[root@centos7u6 log]# find /etc/ -atime +7 |tail -5 | xargs ls -lh
-rw-r--r--. 1 root root 12K Mar 13 13:44 /etc/aliases.db
-rw-r-----. 1 root root 1.8K Oct 30 22:38 /etc/sudo.conf
-r--r-----. 1 root root 4.3K Oct 30 22:38 /etc/sudoers
-rw-r-----. 1 root root 3.2K Oct 30 22:38 /etc/sudo-ldap.conf
-rw-r--r--. 1 root root 163 Mar 13 12:15 /etc/.updated
#atime -1示例,查找/root/下,被访问时间<24小时的文件
[root@centos7u6 tmp]# find /root/ -atime -1 -ls
33574977 0 dr-xr-x--- 3 root root 183 Mar 28 14:42 /root/
33915950 4 -rw-r--r-- 1 root root 176 Dec 29 2013 /root/.bash_profile
33575020 8 -rw------- 1 root root 4747 Mar 28 01:17 /root/.bash_history
33575031 0 drwxr-xr-x 2 root root 92 Mar 28 09:09 /root/test
33619012 4 -rw------- 1 root root 40 Mar 28 14:41 /root/.lesshst
33960893 4 -rw-r--r-- 1 root root 80 Mar 28 14:41 /root/test_fls.txt
-mtime
-ctime
- 以“分钟”为单位:
-amin
-mmin
-cmin
根据权限查找
-perm
- -perm [/|-]mode
mode:精确权限匹配;
#mode示例,查找/root/test/目录下,权限为777的文件
[root@centos7u6 test]# ll
total 20
-rwxrwxrwx. 1 root root 0 Mar 28 20:09 a
-r--r-----. 1 root root 0 Mar 28 20:09 b
-rw-r--r--. 1 root root 478 Mar 27 14:29 fstab
-rw-r--r--. 1 root root 522 Mar 27 14:26 fstab.new
-rw-r--r--. 1 root root 79 Mar 27 14:27 fstab.patch
-rwxr-xr-x. 1 root root 92 Mar 26 23:08 myfirst.sh
-rw-r--r--. 1 root root 46 Mar 26 23:25 mysecond.sh
[root@centos7u6 test]#
[root@centos7u6 test]#
[root@centos7u6 test]# find /root/test -perm 777
/root/test/a
[root@centos7u6 test]# find /root/test -perm 777 -ls
33619011 0 -rwxrwxrwx 1 root root 0 Mar 28 20:09 /root/test/a
[root@centos7u6 test]#
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;
9位权限之间存在“或”关系;
#-perm /mode示例,查找/root/test/目录下,属主、属组、其他中至少一个有写权限的文件
[root@centos7u6 test]# ll
total 20
-rwxrwxrwx. 1 root root 0 Mar 28 20:09 a
-r--r-----. 1 root root 0 Mar 28 20:09 b
-rw-r--r--. 1 root root 0 Mar 28 20:13 c
-rw-r--r--. 1 root root 478 Mar 27 14:29 fstab
-rw-r--r--. 1 root root 522 Mar 27 14:26 fstab.new
-rw-r--r--. 1 root root 79 Mar 27 14:27 fstab.patch
-rwxr-xr-x. 1 root root 92 Mar 26 23:08 myfirst.sh
-rw-r--r--. 1 root root 46 Mar 26 23:25 mysecond.sh
[root@centos7u6 test]# find /root/test/ -perm /222 -ls
33575031 0 drwxr-xr-x 2 root root 119 Mar 28 20:13 /root/test/
33575033 4 -rw-r--r-- 1 root root 478 Mar 27 14:29 /root/test/fstab
33960891 4 -rw-r--r-- 1 root root 522 Mar 27 14:26 /root/test/fstab.new
33960889 4 -rw-r--r-- 1 root root 79 Mar 27 14:27 /root/test/fstab.patch
33575032 4 -rwxr-xr-x 1 root root 92 Mar 26 23:08 /root/test/myfirst.sh
33575038 4 -rw-r--r-- 1 root root 46 Mar 26 23:25 /root/test/mysecond.sh
33619011 0 -rwxrwxrwx 1 root root 0 Mar 28 20:09 /root/test/a
33960890 0 -rw-r--r-- 1 root root 0 Mar 28 20:13 /root/test/c
[root@centos7u6 test]#
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
#-mode示例,查找/root/test/目录下,权限至少为755的文件
[root@centos7u6 test]# ls -l
total 20
-rwxrwxrwx. 1 root root 0 Mar 28 20:09 a
-r--r-----. 1 root root 0 Mar 28 20:09 b
-rw-r--r--. 1 root root 0 Mar 28 20:13 c
-rw-r--r--. 1 root root 478 Mar 27 14:29 fstab
-rw-r--r--. 1 root root 522 Mar 27 14:26 fstab.new
-rw-r--r--. 1 root root 79 Mar 27 14:27 fstab.patch
-rwxr-xr-x. 1 root root 92 Mar 26 23:08 myfirst.sh
-rw-r--r--. 1 root root 46 Mar 26 23:25 mysecond.sh
[root@centos7u6 test]# find /root/test -perm -755 -ls
33575031 0 drwxr-xr-x 2 root root 119 Mar 28 20:13 /root/test
33575032 4 -rwxr-xr-x 1 root root 92 Mar 26 23:08 /root/test/myfirst.sh
33619011 0 -rwxrwxrwx 1 root root 0 Mar 28 20:09 /root/test/a
处理动作
处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;
常用选项
- -print:输出至标准输出;默认的动作;
[root@centos7u6 dev]# find /etc/ -name fstab
/etc/fstab
[root@centos7u6 dev]#
-ls
- -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
[root@centos7u6 dev]# find /etc/ -name fstab -ls
16777282 4 -rw-r--r-- 1 root root 465 Mar 13 12:15 /etc/fstab
-delete
- -delete:删除查找到的文件;(危险操作)
[root@centos7u6 tmp]# ls /tmp/
fstab Fstab FSTAB test user3 user4 vmware-root_6179-1991648272
[root@centos7u6 tmp]# find /tmp/ -name FSTAB -delete
[root@centos7u6 tmp]# ls /tmp
fstab Fstab test user3 user4 vmware-root_6179-1991648272
-fls
- -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
[root@centos7u6 ~]# find /root/ -name test -fls /root/test_fls.txt
[root@centos7u6 ~]# ls
anaconda-ks.cfg test test_fls.txt
-ok COMMAND {} ;
- -ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
[root@centos7u6 tmp]# ls /tmp/
fstab Fstab test user3 user4 vmware-root_6179-1991648272
[root@centos7u6 tmp]# find /tmp/ -iname "fstab" -ok rm {} \;
< rm ... /tmp/fstab > ? y
< rm ... /tmp/Fstab > ? y
[root@centos7u6 tmp]# ls /tmp
test user3 user4 vmware-root_6179-1991648272
-exec COMMAND {} ;
- -exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;不再每次操作都进行确认;
#-exec示例,查找/tmp/下的权限为644的文件,并对其文件名添加.new后缀
[root@centos7u6 tmp]# ls -l
total 0
-rw-rw-r--. 1 test test 0 Mar 27 16:19 test
-rw-r--r--. 1 root root 0 Mar 28 20:33 user3
-rw-r--r--. 1 root root 0 Mar 28 20:33 user4
drwx------. 2 root root 6 Mar 28 09:02 vmware-root_6179-1991648272
[root@centos7u6 tmp]# find /tmp/ -perm 644 -exec mv {} {}.new \;
[root@centos7u6 tmp]# ls -l
total 0
-rw-rw-r--. 1 test test 0 Mar 27 16:19 test
-rw-r--r--. 1 root root 0 Mar 28 20:33 user3.new
-rw-r--r--. 1 root root 0 Mar 28 20:33 user4.new
drwx------. 2 root root 6 Mar 28 09:02 vmware-root_6179-1991648272
[root@centos7u6 tmp]#
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,再一次性传递给后面的命令;但是有些命令不能接受过长的参数(例如有些命令只能有一个参数),此时命令执行会失败;另一种方式可规避此问题:
find | xargs COMMAND
其他
前面的一些示例,也简单的使用了xargs,对于xargs较为详细的用法,将在后面进行总结。