1、which:可执行文件的查找
通常通过PATH环境变量到该路径内找可执行文件,所以一般找到的就是命令的存放路径。
常见选项:
-a:将所有有PATH目录中的可以找到的指令均列出,而不是第一个被找到的指令名称。
但是which只可以找到PATH所规范的目录,有的命令是bash内置的就不会被查找到。可以试下使用type来判断命令的类型。
example 1:
[nebula6@master ~]$ type which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[nebula6@master ~]$ which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/bin/alias
/usr/bin/which
2、locate:文件名的查找
常见选项:
-i:忽略大小写
-r:后面可以接正则
locate的查找速度是非常快的
但是locate使用是有限制的,因为使用locate寻找的数据是由已创建的数据库/var/lib/mlocate里面的数据所查找到的,不用去硬盘中找,所以很快。
但是数据库一般一天才会更新一次,所以一般新建的文件不会立即被查找到,必须要更新数据库,如何手动更新数据库呢?
使用命令updatedb就可以了。updatedb命令会去读取/etc/updatedb.conf这个配置文件的设置,然后再去硬盘里面进行查找文件名的操作,最后就更新整个数据库文件了!因为updatedb会去读取硬盘,所以一般比较费时间。
example 1
[root@master ~]# touch today_locate
[root@master ~]# locate today_locate
[root@master ~]# updatedb
[root@master ~]# locate today_locate
/root/today_locate
example 2
[root@master ~]# touch ac_locate{1,2,3,4,5}
[root@master ~]# locate -r "ac_locate*"
[root@master ~]# updatedb
[root@master ~]# locate -r "ac_locate*"
/root/ac_locate1
/root/ac_locate2
/root/ac_locate3
/root/ac_locate4
/root/ac_locate5
但是遇到一个问题:我在/tmp下面创建的文件,同样的方法确还是查找不到?原因?
3、whereis:寻找特定的文件
常见选项:
-b:只查找二进制格式的文件
-m:只找在manual路径下的文件
-s:只找source源文件
-u:查找不在上述三个里面的文件
example 1
[root@master ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
[root@master ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz
whereis与locate一样都是基于数据库进行查找的。所以速度非常快。
4、find:最强大的查找命令
find查找速度比较慢,是直接读取硬盘的。
常见选项:
1、与时间有关的参数:
-mtime days:在days天之前的“一天内”被更改过的文件
-mtime +days:在days天之前(不含days自身)被更改过得文件名
-mtime -days:在days天内被更改过得文件名
-newer file : 比file 文件还要新的文件名
-ctime days:将days天之前一天内改变、新增的文件或者目录列举出来
-aitme days:将将days天之前一天内存取过得文件或者目录列出来
- +4:代表大于或者等于5天前的文件名
- -4:代表小于或者等于4天内的文件名
- 4:代表4-5天那一天的文件名
example 1
查找/home目录下面最近一周内其内容被修改过,且属主不是root用户也不是nebula用户的文件或目录:
[root@master ~]# find /home -mtime -7 -a -not -user root -a -not -user nebula
/home/nebula1
/home/nebula2
/home/nebula5
/home/nebula5/.bash_history
/home/cat1
/home/nebula6
example 2
查找/etc下面比/etc/passwd更新的文件或者目录:
[root@master ~]# find /etc -newer /etc/passwd
/etc
/etc/group
/etc/gshadow
/etc/shadow
/etc/group-
/etc/gshadow-
/etc/cron.daily
/etc/sudoers
/etc/updatedb.conf
常见选项:
2、与用户或者用户组有关的参数:
-uid num:UID为num这个用户的文件或目录
-gid num:GID为num这个组的文件或目录
-user name :用户名为name的文件或者目录
-group name:组名为name的文件名或者目录
-nouser:文件所有者不存在的文件名,可以看做孤儿,比如:删除了某个用户,但是没有加-r,其家目录依然存在。
-nogroup:寻找文件的拥有群组不存在于/etc/group的文件名或者目录。
example 1
查找/home下的“孤儿”:
[root@master ~]# find /home -nouser
/home/nebula7
/home/nebula7/.bash_logout
/home/nebula7/.bash_profile
/home/nebula7/.bashrc
常见选项:
3、与文件权限及名称有关的相关参数:
-name filename :查找文件名为filename的文件
-size [+/-]SIZE:查找比SIZE还要大或者小的文件,
-type TYPES:查找文件的类型是TYPES的文件
f:普通文件
d:目录
l:链接文件
b,c:设备文件
s:套接字文件
-perm -mode:查找文件权限“必须要全部包括mode的权限”的文件。
比如:查找744的文件,777也会被列出来,755也会。
-perm /mode:查找文件权限“包含任一mode的权限”的文件。比如查找600文件时,400也会被列出,200也会
-perm这个参数还可以找出特殊权限的文件,suid,sgid都可以被设置在二进制程序上。
常见选项:
4、其他可进行的操作:
-exec command :command为其他命令,-exec后面可再接其他命令来处理查找到的结果
-print :将结果打印在屏幕上
区分:-exec参数是一个一个传递的
文件有空格字符也能处理
-xargs:一次将参数传给命令,可以使用-n控制参数的个数
example 1
查找/目录下属主为root,且属组为nebula的所有文件或目录:
[root@master tmp]# find / -user root -a -group nebula
/proc/3026
/proc/3026/task
/proc/3026/task/3026
/proc/3026/task/3026/net
/proc/3026/task/3026/attr
example 2
查找/etc/下面大于2M且类型为普通文件的所有文件:
[root@master tmp]# find /etc -size +2M -type f -exec ls -lh {} \;
-r--r--r--. 1 root root 7.5M Oct 31 21:38 /etc/udev/hwdb.bin
-rw-r--r--. 1 root root 3.6M Jul 31 21:55 /etc/selinux/targeted/policy/policy.31
-rw-------. 1 root root 3.6M Jul 31 21:55 /etc/selinux/targeted/active/policy.kern
-rw-------. 1 root root 3.6M Jul 31 21:55 /etc/selinux/targeted/active/policy.linked
example 3
查找/etc目录下面至少有一类用户没有执行权限的文件:
[root@master ~]# find /etc -not -perm /222 -print |xargs ls -l
----------. 1 root root 878 Nov 1 14:55 /etc/gshadow
----------. 1 root root 890 Nov 1 14:55 /etc/gshadow-
-r--r--r--. 1 root root 63 Nov 20 2015 /etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf
-r--r--r--. 1 root root 63 Jul 17 00:45 /etc/ld.so.conf.d/kernel-3.10.0-862.9.1.el7.x86_64.conf
-r--r--r--. 1 root root 33 Jul 27 15:02 /etc/machine-id
-r--------. 1 root root 45 Jul 27 15:02 /etc/openldap/certs/password
-r--r--r--. 1 root root 211943 Jul 31 21:50 /etc/pki/ca-trust/extracted/java/cacerts
-r--r--r--. 1 root root 398934 Jul 31 21:50 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
-r--r--r--. 1 root root 243579 Jul 31 21:50 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
-r--r--r--. 1 root root 64711 Jul 31 21:50 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
-r--r--r--. 1 root root 290670 Jul 31 21:50 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
-r--------. 1 root root 1675 Aug 30 15:44 /etc/salt/pki/master/master.pem
----------. 1 root root 1806 Nov 1 14:55 /etc/shadow
----------. 1 root root 1836 Nov 1 14:55 /etc/shadow-
-r--r-----. 1 root root 3937 Nov 1 13:16 /etc/sudoers
-r--r--r--. 1 root root 7780559 Oct 31 21:38 /etc/udev/hwdb.b
example 4
查找/etc/init.d目录下,所有用户都有执行权限,且其他用户有些权限的所有文件:
[root@master ~]# find /etc/init.d -perm -113 -type f