首页 > 代码库 > Linux 系统的下文件查找

Linux 系统的下文件查找

Linux 系统下文件查找

1、which

(1)作用:用于查找并显示给定命令的绝对路径

(2)语法:which(选项)(参数)

(3)案例:

[root@localhost ~]# which cd       #查找cd命令的路径

/usr/bin/cd

[root@localhost ~]# which cp       #查找cp命令的路径

alias cp=‘cp -i‘

            /usr/bin/cp

2、whereis

(1)作用:来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。
(2)语法:whereis(选项)(参数)

(3)案例:

[root@dayi123 ~]# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz

[root@dayi123 ~]# whereis shutdown

shutdown: /usr/sbin/shutdown /usr/share/man/man8/shutdown.8.gz

3、locate

(1)作用:查找文件或目录

(2)查找原理:根据系统上预建的文件索引数据库查找文件,依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务)或管理员手动更新数据库(updatedb),索引构建过程需要遍历整个根文件系统,极消耗资源

(3)工作特点:查找速度快、模糊查找、非实时查找、搜索的是文件的全路径,不仅仅是文件名、可能只搜索用户具备读取和执行权限的目录

(4)语法:locate (选项)(参数)

      参数:-i 执行区分大小写的搜索

-n N只列举前N个匹配项目

(5)案例:

[root@dayi123 ~]# locate install.log    #查找install.log文件

/root/install.log

/root/install.log.syslog

 [root@dayi123 ~]# locate -n 6 *.sh    #查找.sh结尾的文件,只显示前6

/etc/acpi/actions/power.sh

/etc/bash_completion.d/gdbus-bash-completion.sh

/etc/dhcp/dhclient.d/ntp.sh

/etc/profile.d/colorls.sh

/etc/profile.d/glib2.sh

/etc/profile.d/lang.sh

(6)更新数据库:updatedb

locate对新建的文件查找不到,需要跟新数据库后才能查找

[root@dayi123 ~]# touch dayi123.html

[root@dayi123 ~]# locate dayi123.html   #查找不到新建的文件

[root@dayi123 ~]# updatedb                      #更新数据库

[root@dayi123 ~]# locate dayi123.html   #更新数据库后才能正常查找新建文件

/root/dayi123.html

4、find

(1)作用:实时查找工具,通过遍历指定路径完成文件查找

(2)语法:find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录

查找条件:指定的查找标准,可以文件名、大小、类型、

权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

(3)查找条件:

1)根据文件名和inode查找:

条件:-name "文件名称":支持使用*, ?, [], [^]

-iname "文件名称":不区分字母大小写

-inum n 按inode号查找

-samefile name 相同inode号的文件

-links n 链接数为n的文件

-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

[root@dayi123 ~]# find . -name dayi123.html #当前目录下查找文件名为dayi123.html文件

./dayi123.html

 [root@dayi123 ~]# find . -inum 140370    #当前目录下查找inode号为140370的文件

./1.txt

[root@dayi123 ~]# find . -links 2           #当前目录下查找链接数为2的文件

./dayi123

./.ssh

2)根据属主、属组查找:

条件:-user USERNAME:查找属主为指定用户(UID)的文件

-group GRPNAME: 查找属组为指定组(GID)的文件

-uid UserID:查找属主为指定的UID号的文件

-gid GroupID:查找属组为指定的GID号的文件

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

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

[root@dayi123 ~]# find /home/ -user dayi123   #查找属主为dayi123的文件

/home/dayi123

/home/dayi123/.bashrc

/home/dayi123/.bash_profile

/home/dayi123/.bash_logout

/var/spool/mail/dayi123

[root@dayi123 ~]# find /home/ -group hehe   #查找属组为hehe的文件

/home/hehe

/home/hehe/.bashrc

/home/hehe/.bash_profile

/home/hehe/.bash_logout

[root@dayi123 ~]# userdel hehe

[root@dayi123 ~]# find ./ -nourser

find: unknown predicate `-nourser‘

[root@dayi123 ~]# find ./ -nouser           #查找没有属组的文件

./hehe.log

3)根据文件类型查找:

条件:-type TYPE:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

[root@dayi123 ~]# find . -type f     #查找当前目录下的文件     

./.bashrc

./1.txt

./.viminfo

./.bash_profile

./dayi123.html

./install.log

……

 [root@dayi123 ~]# find /bin/ -type f   #查找/bin/目录下的链接文件

/bin/taskset

/bin/ipcalc

/bin/gunzip

/bin/uname

……

4)根据文件大小来查找:

条件:-size [+|-]#UNIT

常用单位:k, M, G

[root@dayi123 ~]# find /etc/sysconfig/ -size +5k  #查找/etc/sysconfig/下大于5k的文件

/etc/sysconfig/sysstat.ioconf

/etc/sysconfig/network-scripts/ifup-eth

……

 [root@dayi123 ~]# find /etc/sysconfig/ -size -4k#查找/etc/sysconfig/下小于4k的文件

/etc/sysconfig/grub

/etc/sysconfig/ntpdate

/etc/sysconfig/readahead

……

5)根据时间查找(根据时间戳):

以“天”为单位;

-atime [+|-]#, 文件访问时间

-mtime [+|-]#, 文件修改时间

-ctime [+|-]#, 更改文件属性时间

以“分钟”为单位:

-amin

-mmin

-cmin

[root@dayi123 ~]# find /home/ -mtime +9   #查找9天前修改过文件内容的文件    

/home/dayi123/.bashrc

/home/dayi123/.bash_profile

/home/dayi123/.bash_logout

[root@dayi123 ~]# find /etc/sysconfig/ -mtime -7  #查找7天内修改过文件内容的文件

/etc/sysconfig/

/etc/sysconfig/grub

/etc/sysconfig/keyboard

/etc/sysconfig/cbq

/etc/sysconfig/i18n

[root@dayi123 ~]# find /etc/sysconfig/ -mtime 6  #今天起往前第6天修改过内容的文件

/etc/selinux/targeted/modules/active/modules/firewallgui.pp

/etc/selinux/targeted/modules/active/modules/inn.pp

6)根据权限查找:

条件:-perm [/|-]MODE

MODE: 精确权限匹配

/|+MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,centos6位+,centos7为/

-MODE:每一类对象都必须同时拥有指定权限,与关系

用法说明:

find -perm 755 会匹配权限模式恰好是755的文件

只要当任意人有写权限时,find -perm +|/222就会匹配

只有当每个人都有写权限时,find -perm -222才会匹配

只有当其它人(other)有写权限时,find -perm -002才会匹配

[root@dayi123 ~]# find ./ -perm 755  #匹配权限恰好是755的文件

./dayi123.txt

./dayi.txt

./hahl

[root@dayi123 ~]# find ./ -perm -222  #匹配所有用户都有写权限的文件

./test

[root@dayi123 ~]# find ./ -perm /222  #匹配任意人都有写权限的文件

./.bash_logout

./.bash_profile

./.bashrc

./.cshrc

./.tcshrc

./anaconda-ks.cfg

    7)组合条件

组合条件:与:-a

或:-o

非:-not, !

v 德·摩根定律:

(非 P) 或 (非 Q) = 非(P 且 Q)

(非 P) 且 (非 Q) = 非(P 或 Q)

[root@dayi123 ~]# find ./ -user dayi -not -group dayi

#查找属主是dayi且属组不是dayi的文件

./dayi.txt

[root@dayi123 ~]# find -not \( -user dayi -o -user dayi123 \)

#查找属主不是dayi或属主不是dayi123的文件         

.

./.bash_logout

./.bash_profile

./.bashrc

./.cshrc

./.tcshrc

(4)处理动作:

1)-print:默认的处理动作,显示至屏幕;

[root@dayi123 ~]# find ./ -name dayi.txt -print

./dayi.txt

2)-ls:类似于对查找到的文件执行“ls -l”命令

[root@dayi123 ~]# find ./ -name dayi.txt -ls

68002599    4 -rwxr-xr-x   1 dayi     dayi123        22 Mar 31 15:56 ./dayi.txt

3)-delete:删除查找到的文件;

[root@dayi123 ~]# find ./ -name dayi.txt –delete

4)-fls file:查找到的所有文件的长格式信息保存至指定文件中

[root@dayi123 ~]# find ./ -name dayi123.txt -fls dayi123.log

[root@dayi123 ~]# cat dayi123.log

68002562    4 -rwxr-xr-x   1 root     root           17 Mar 31 13:22 ./dayi123.txt

5)-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;

对于每个文件执行命令之前,都会交互式要求用户确认

[root@dayi123 ~]# find ./ -name dayi123.log -ok ls -l {} \;

< ls ... ./dayi123.log > ? y

-rw-r--r--. 1 root root 83 Apr  7 18:36 ./dayi123.log

6)-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

{}: 用于引用查找到的文件名称自身

[root@dayi123 ~]# find ./ -name dayi123.log -exec ls -l {} \; 

-rw-r--r--. 1 root root 83 Apr  7 18:36 ./dayi123.log

7)有些命令不能接受过多参数,此时命令执行可能会失败,可用find | xargs COMMAND方式规避此问题

[root@dayi123 ~]# find /var/ -type f | xargs ls -l

-rw-r--r--.   1 root root 64 Mar 29 06:49 /var/lib/yum/yumdb/d/1d144f3e96982fed47c4e94fde884e48172b8c3b-dbus-glib-0.100-7.el7-x86_64/checksum_data

-rw-r--r--. 322 root root  6 Mar 29 06:49 /var/lib/yum/yumdb/d/1d144f3e96982fed47c4e94fde884e48172b8c3b-dbus-glib-0.100-7.el7-x86_64/checksum_type

(5)find综合案例

    1)查找/var目录下属主为root,且属组为mail的所有文件

[root@dayi123 ~]# find /var/ -user root -a -group mail

/var/spool/mail

/var/spool/mqueue

/var/dayi

2)查找/usr目录下不属于root、lp、gdm的所有文件

[root@dayi123 ~]# find /usr/ -not \( -user root -o -user lp -o -user gdm \)

/usr/share/polkit-1/rules.d

[root@dayi123 ~]# find /usr -not -user root -a -not -user lp -a -not -user gdm

/usr/share/polkit-1/rules.d

3)、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

[root@dayi123 ~]# find /etc -mtime -7 -a -not -user root -a -not -user postfix

[root@dayi123 ~]# find /etc/ -mtime -7 -a -not \( -user root -o -user postfix \)

4)查找/etc目录下大于1M且类型为普通文件的所有文件

[root@dayi123 ~]# find /etc/ -size +1M -a -type f

/etc/udev/hwdb.bin

/etc/selinux/targeted/contexts/files/file_contexts.bin

/etc/selinux/targeted/policy/policy.29

5)查找/etc目录下至少有一类用户没有执行权限的文件

[root@dayi123 ~]# find /etc -not -perm -111

34676121   12 -rw-r--r--   1 root     root         8940 Apr  5 19:43 /etc/selinux/targeted/modules/active/modules/authconfig.pp

34769376   12 -rw-r--r--   1 root     root         8234 Apr  5 19:43 /etc/selinux/targeted/modules/active/modules/jockey.pp

           6)查找/etc目录下所有用户都没有写权限的文件

[root@dayi123 ~]# find /etc -not -perm /222 -ls

33766578  196 -r--r--r--   1 root     root       198453 Mar 29 06:44 /etc/pki/ca-trust/extracted/java/cacerts

67271661  352 -r--r--r--   1 root     root       359773 Mar 29 06:44 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt

7)查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

[root@localhost ~]# find /etc/init.d/ -perm -111 -a -perm -002

[root@localhost ~]# find /etc/init.d/ -perm -113

本文出自 “dayi123” 博客,请务必保留此出处http://dayi123.blog.51cto.com/12064061/1914007

Linux 系统的下文件查找