本次记录以下命令如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 {} \;<-- 找出>2k3k的文件

-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