本次记录以下命令如locate, find的使用格式、常用选项及它们有哪些使用实例等。
wlocate与find命令的特性
locate与find命令都用来查找文件或目录的。但明显locate查找速度要比find快得多,原因在于locate不需要搜索具体目录,而是搜索一个数据库文件。一般来说,Linux系统会将系统内的所有文件都记录在一个数据库文件里面,Linux系统自动创建这个数据库,且每天自动更新一次,所以有时你还发现使用locate,会找到已经被删掉的文件!也会查不到最新变动过的文件。
find命令是直接查找硬盘,比较耗费时间。
1. Locate命令
用来查找文件或目录。它是非实时查找工具,依赖于事先构建好的索引,而不是在文件系统上直接搜索的。查找速度快,模糊查找。
Locate寻找的数据是由已创建的数据库/var/lib/mlocate里面的数据所查找到的,此数据库每天更新一次,所以当你新建文件后查找该文件,那么locate会告诉你“找不到”!因为必须要更新数据库。
手动通过updatedb命令读取/etc/updated.conf的设置去查找系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件。
Locate依据/var/lib/mlocate内数据库记载,找出用户输入的关键字文件名。
查找文件与目录Locate命令格式:
locate [OPTION]... PATTERN...
OPTION:
-i 忽略大小写
-r 可接正则表达式的显示方式
[root@www tmp]# locate -r 'pwd$' |grep -n 'pwd$'
1:/bin/pwd
2:/sbin/unix_chkpwd
3:/usr/lib64/cracklib_dict.pwd
4:/usr/share/cracklib/cracklib-small.pwd
5:/usr/share/cracklib/pw_dict.pwd
-n# 至多显示n个输出
[root@www tmp]# locate -n10 'pass'
/etc/passwd
/etc/passwd-
/etc/openldap/certs/password
/etc/pam.d/gdm-password
/etc/pam.d/passwd
/etc/pam.d/password-auth
/etc/pam.d/password-auth-ac
/etc/profile.d/gnome-ssh-askpass.csh
/etc/profile.d/gnome-ssh-askpass.sh
/etc/security/opasswd
2. find命令
用来在指定的目录下查找文件。它是实时查找工具,精确匹配查找
在指定的目录下查找文件的命令格式:
find [OPTION]...[查找路径][查找条件][处理动作]
查找路径:如果未指定,则默认为当前路径
组合查找条件:
与条件: -a 可以省略
或条件: -o 优先级最低
非条件: -not, ! 优先级高
!A -o !B = !(A -a B)
!A -a !B = !(A -o B)
查找条件:
w 根据文件名进行查找
-name filename: 查找文件名为filename的文件(支持glob)
[root@www lab]# find /etc -name "*.conf" |tail -n 10|grep -n 'conf'
1:/etc/request-key.conf
2:/etc/prelink.conf
3:/etc/mke2fs.conf
4:/etc/logrotate.conf
5:/etc/ant.conf
6:/etc/mtools.conf
7:/etc/udev/udev.conf
8:/etc/dracut.conf
9:/etc/yp.conf
10:/etc/sgml/sgml.conf
-iname filename 不区分字符大小写
-regex “PATTERN”指定字符串作为寻找文件或目录的范本样式
[root@www lab]# find /lab -regex '.*\(\.txt\)$'
/lab/readme.txt
/lab/regular_express.txt
/lab/character.txt
w 根据属主、属组查找
-user USERNAME 查找属主为指定用户的文件
[root@www lab]# find /lab -user Allen -ls
430089 4 -rw-r--r-- 1 Allen asdgrp 21 9月 11 13:33 /lab/readme.txt
-group GROUPNAME 查找属组为指定组的文件
[root@www ~]# find /lab -group asdgrp
/lab/readme.txt
-uid UserID 查找文件的属主为指定uid的文件
-gid GroupID 查找文件的属组为指定gid的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
[root@www ~]# ll /lab
总用量 52
drwxr-xr-x. 3 root root 4096 9月 6 09:54 123
-rw-r--r--. 1 root root 71 9月 7 12:50 character.txt
-rw-r--r--. 1 root root 899 8月 17 19:30 fstab
-rw-r--r--. 1 root root 19846 9月 9 17:26 functions
-rw-r--r--. 1 505 asdgrp 21 9月 11 13:33 readme.txt
-rw-r--r--. 1 root root 650 9月 6 09:55 regular_express.txt
-rw-r--r--. 1 root root 115 9月 6 09:57 t1
-rw-r--r--. 1 root root 112 9月 6 09:57 t2
-rw-r--r--. 1 root root 170 9月 6 09:58 t3
[root@www ~]# find /lab -uid 505 -ls
430089 4 -rw-r--r-- 1 505 asdgrp 21 9月 11 13:33 /lab/readme.txt
[root@www ~]# find /lab -nouser -ls
430089 4 -rw-r--r-- 1 505 asdgrp 21 9月 11 13:33 /lab/readme.txt
[root@www ~]# find /lab -nogroup -ls
430089 4 -rw-r--r-- 1 505 505 21 9月 11 13:33 /lab/readme.txt
w 根据文件类型进行查找
-type TYPE
[root@www lab]# find -type f -ls
430082 4 -rw-r--r-- 1 root root 112 9月 6 09:57 ./t2
430089 4 -rw-r--r-- 1 505 505 21 9月 11 13:33 ./readme.txt
430077 4 -rw-r--r-- 1 root root 650 9月 6 09:55 ./regular_express.txt
430092 20 -rw-r--r-- 1 root root 19846 9月 9 17:26 ./functions
430073 4 -rw-r--r-- 1 root root 899 8月 17 19:30 ./fstab
430081 4 -rw-r--r-- 1 root root 115 9月 6 09:57 ./t1
430083 4 -rw-r--r-- 1 root root 170 9月 6 09:58 ./t3
389380 4 -rw-r--r-- 1 root root 71 9月 7 12:50 ./character.txt
w 使用组合条件进行查找
[root@www ~]# find /lab -type f -a -nouser -ls
430089 4 -rw-r--r-- 1 505 505 21 9月 11 13:33 /lab/readme.txt
[root@www ~]# find /etc ! -name '*.conf' |tail -n 10
/etc/logrotate.d/yum
/etc/logrotate.d/dracut
/etc/logrotate.d/iscsiuiolog
/etc/logrotate.d/ppp
/etc/logrotate.d/libvirtd.lxc
/etc/logrotate.d/wpa_supplicant
/etc/logrotate.d/glusterfs
/etc/logrotate.d/sssd
/etc/logrotate.d/syslog
/etc/logrotate.d/psacct
[root@www ~]# find /etc -not -name "*.txt" -a -not -type l -ls |head -n 3
[root@www ~]# find /etc ! \( -name "*.txt" -o -type l \) -ls |head -n 3
389381 12 drwxr-xr-x 125 root root 12288 9月 11 15:49 /etc
414087 16 -rw-r--r-- 1 root root 12623 7月 24 09:34 /etc/autofs.conf
408995 4 drwxr-xr-x 3 root root 4096 8月 17 19:42 /etc/sound
w 根据文件大小来查找
-size: [+|-]#UNIT
#UNIT (#-1,#]
+UNIT (#,+∞)
-UNIT [0, #-1]
[root@www ~]# find /etc -size 3k -exec ls -lh {} \;<-- 找出>2k≤3k的文件
-rw-r--r--. 1 root root 2.5K 11月 11 2010 /etc/udev/rules.d/97-bluetooth-serial.rules
-rw-r--r--. 1 root root 2.6K 8月 17 2010 /etc/mtools.conf
-rwxr-xr-x. 1 root root 2.6K 10月 16 2014 /etc/gdm/Init/Default
-rw-r--r--. 1 root root 2.9K 11月 23 2013 /etc/init/readahead-collector.conf
-rw-r--r--. 1 root root 2.3K 7月 24 09:38 /etc/selinux/semanage.conf
-rw-r--r--. 1 root root 2.9K 7月 24 21:05 /etc/selinux/targeted/contexts/x_contexts
-rw-r--r--. 1 root root 2.1K 11月 11 2010 /etc/bluetooth/main.conf
-rw-r--r--. 1 root root 2.1K 9月 7 23:36 /etc/passwd
-rw-r--r--. 1 root root 2.6K 11月 12 2010 /etc/latrace.d/signal.conf
-rw-r--r--. 1 root root 2.3K 11月 12 2010 /etc/latrace.d/resource.conf
w 根据文件时间戳查找
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间
变化时间(-ctime/天,-cmin/分钟):文件元数据最后一次修改时间
以atime为例,-atime 3表示访问时间范围为≥3天<4天
[root@www lab]# find /lab -mtime -3 –ls<-- 找出≤3天内的文件
297972 0 -rw-rw-rw- 1 root root 0 9月 9 06:20 /lab/jjj
[root@www lab]# date
2015年 09月 12日 星期六 05:41:29 CST
[root@www lab]# touch -m -t 201509080101 abc
[root@www lab]# find /lab -mtime +3 –ls <-- 找出≥4天前的文件
4770 4 -rw-r--r-- 1 root root 143 9月 7 23:05 /lab/testing
297967 4 -rw-r--r-- 1 root root 15 8月 28 21:04 /lab/inpub_txt
297966 4 -rw-r--r-- 1 root root 51 8月 28 20:29 /lab/var.err
297971 4 -rwxr-xr-x 1 Oracle agetest 113 9月 5 20:44 /lab/t2
297975 0 -rw-r--r-- 1 root root 0 9月 8 01:01 /lab/abc
297969 4 -rw-r--r-- 1 root root 51 9月 7 06:21 /lab/character.txt
297970 4 -rw-rw-rw- 1 Oracle agetest 170 9月 5 20:45 /lab/t3
297974 4 -rw-r--r-- 1 root root 114 9月 5 21:10 /lab/t1
w 根据权限查找
-perm [/|-]MODE
MODE:精确权限匹配
[root@www ~]# find /etc -perm 400 -ls
404218 4 -r-------- 1 root root 45 8月 17 19:37 /etc/openldap/certs/password
/MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可
[root@www 123]# ll
总用量 4
drwxr-xr-x. 3 root root 4096 9月 6 09:54 456
-r--r--r--. 1 root root 0 9月 12 09:11 aa
-rw-r-----. 1 root root 0 9月 12 09:11 bb
-rw-rw----. 1 root root 0 9月 12 09:11 cc
-rwxrwxrwx. 1 root root 0 9月 12 09:11 dd
-rw-r--r--. 1 root root 0 9月 12 09:11 ee
[root@www 123]# find . -perm /020 -ls
554308 0 -rw-rw---- 1 root root 0 9月 12 09:11 ./cc
554309 0 -rwxrwxrwx 1 root root 0 9月 12 09:11 ./dd
-MODE:每一类对象指定的每位权限都必须同时存在
[root@www 123]# find . -perm -201 -ls
554303 4 drwxr-xr-x 3 root root 4096 9月 12 09:11 .
554304 4 drwxr-xr-x 3 root root 4096 9月 6 09:54 ./456
554305 4 drwxr-xr-x 2 root root 4096 9月 6 09:54 ./456/789
554309 0 -rwxrwxrwx 1 root root 0 9月 12 09:11 ./dd
处理动作:
-print:默认处理动作
-ls: 类似于对查找到的每个文件做"ls -l"操作
-delete: 删除查找到的文件
-fls /path/to/somefile: 查找到的文件的详细路径信息保存至指定文件中
-ok COMMAND {} \;
对每个文件执行指定的命令之前需要用户事先确认
-exec COMMAND {} \;
无需用户确认
{} 用于与-exec选项结合使用来匹配所有文件,然后被替换为相应的文件名
[root@www 123]# find . -perm -201 -ls
554303 4 drwxr-xr-x 3 root root 4096 9月 12 09:11 .
554304 4 drwxr-xr-x 3 root root 4096 9月 6 09:54 ./456
554305 4 drwxr-xr-x 2 root root 4096 9月 6 09:54 ./456/789
554309 0 -rwxrwxrwx 1 root root 0 9月 12 09:11 ./dd
[root@www 123]# find . -perm -201 -fls /lab/perm.txt
[root@www 123]# find . ! -perm /111 -exec ls -l {} \;
-rw-r--r--. 1 root root 0 9月 12 09:11 ./ee
-rw-rw----. 1 root root 0 9月 12 09:11 ./cc
-rw-r-----. 1 root root 0 9月 12 09:11 ./bb
-r--r--r--. 1 root root 0 9月 12 09:11 ./aa
[root@www 123]# find . ! -perm /111 -exec mv {} {}.old \;
[root@www 123]# ll
总用量 4
drwxr-xr-x. 3 root root 4096 9月 6 09:54 456
-r--r--r--. 1 root root 0 9月 12 09:11 aa.old
-rw-r-----. 1 root root 0 9月 12 09:11 bb.old
-rw-rw----. 1 root root 0 9月 12 09:11 cc.old
-rwxrwxr-x. 1 root root 0 9月 12 09:11 dd
-rw-r--r--. 1 root root 0 9月 12 09:11 ee.old