原文地址:https://blog.qjm253.cn/?p=463
which
通过检索PATH中包含的目录,寻找一个“可执行文件”的位置
用法介绍
# 用法 which [-a] command # 默认行为 依次检索PATH中的目录,找到第一个与command名字匹配的文件,将其列出 # 参数 -a:将所有由PATH目录中可以找到的命令均列出
注意事项
- 默认情况下which命令时依次检索PATH中的目录,找到第一个符合条件的就输出并返回。如果加上-a参数,则会将PATH中的目录都检索一遍,列出所有符合条件的文件
- 这个命令时根据PATH变量中定义的目录来检索的,不同的用户名登录,PATH可能是不同的。
- 有一些命令是shell内建的命令,用which是检索不到的,例如:cd
whereis
输入完整的文件名或目录名,在数据库中检索
用法介绍
# 用法 whereis [-bmsu] {文件名,目录名} # 参数 -b:只查找二进制文件 -m:只找在说明文件manual路径下的文件 -s:只找源文件 -u:查找不在上述三个选项中的其他文件
注意事项
- Linux系统会将系统内所有的文件都记录在一个数据库文件里面,whereis是直接在这个数据库里面检索。但是数据库并不是实时更新的,有写发行版是每天更新一次,如果想立即更新数据库,需要手动执行updatedb(这个需要若干分钟)
- 由于是直接检索数据库,速度会比find快很多。但是由于具有非实时性,也可能检索到已经被删除的文件
- 更多关于这个数据库的说明,请参参考下面介绍locate时的注意事项
locate
只需要输入部分的文件名或目录名,在数据库中检索
用法介绍
# 用法 locate [-ir] keyword # 参数 -i:忽略大小写差异 -r:后面可接正则表达式
注意事项
- 同样的,locate 也是检索linux中的数据库来进行查询的,具有非实时性,但是速度会比find快很多
- locate和whereis检索的数据库通常记录在 /var/lib/mlocate 中
- updatedb 这个命令会先读取 /etc/updatedb.conf 中的配置信息,并根据这个配置,去硬盘里查找文件名,更新在 /var/lib/mlocate 中的记录
- locate:依据 /var/lib/mlocate 内的数据库记录,找出包含用户输入的关键字的文件名
- whereis:依据 /var/lib/mlocate 内的数据库记录,找到与用户输入的文件名相匹配的记录
find
find的功能非常强大,但是因为是进行硬盘检索,所以效率偏低
基本用法
find [PATH] [option] [action]
与时间有关的参数
参数说明
# 与时间有关的参数:共有-atime、-ctime 与 -mtime,下面以-mtime说明 -mtime n:n为数字,意为在n天前的“一天之内”被修改的文件 -mtime +n:列出在n天之前(不包含n天本身)被更改过的文件 -mtime -n:列出n天内(包含n天本身)被更改过的文件 -newer file:file为一个存在的文件,列出比file还要新的文件
find时间相关参数含义图示
举个栗子
# 将到系统上面24小时内有改动(mtime)的文件列出 find / -mtime 0 # 将到系统上面3天前的24小时内有改动(mtime)的文件列出 find / -mtime 3 # 寻找 /etc 下面的文件,如果文件的日期比 /etc/password 新就列出 find /etc -newer /etc/password
与用户或用户组名字有关的参数
参数说明
-uid n:n为数字,是用户的账号ID,称为UID(在/etc/password中每个账号会关联一个UID) -gid n:n为数字,是组的ID,称为GID(在/etc/group中每个组会关联一个GID) -user name:name为用户账号的名字,例如:sunny -group name:name为用户组名,例如:users -nouser:寻找文件的所有者不存在与/etc/password中的文件 -nogroup:寻找文件的所有用户组不存在与/etc/group中的文件
举个栗子
# 查找 /home 下面属于 sunny的文件 find /home -user sunny # 查找系统中不属于任何人的文件 find / -nouser
说明
如果你想找到某个用户在系统下面创建了什么文件,上面介绍的方法就很适用。至于-nouser和-nogroup的参数功能,除了你*自行由网络上面下载文件时会发生外,如果你将系统里面某个账号删除了,但是该账号已经在系统内创建了若干文件,就可能会有无主文件出现!此时就可以用-nouser来找出此类文件。
与文件权限及名称有关的参数
参数说明
-name filenam:查找文件名为 filename 的文件 -size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件。SIZE的单位有: c:byte k:1024bytes -type TYPE:查找文件类型为TYPE的文件,主要有以下几种类型: f:一般正规文件 b、c:设备文件 d:目录 l:连接文件 s:socket文件 p:FIFO文件 -perm mode:查找文件权限刚好等于mode的文件(mode与chmod命令中用数字表示权限的写法一致) -perm -mode:查找文件权限包含mode中所有权限的文件 -perm +mode:查找文件权限中包含mode中任一权限的文件
举个栗子
# 找到文件名为rein的文件 find / -name rein # 找到 /home 目录下小与50KB的文件 find /home -size -50k # 找到 /var 目录下文件类型为Socket的文件 find /var -type s # 查找系统中所有含有SGID、SUID或SBIT属性的文件 find / -perm +7000 # 所谓的 7000 就是 ---s--s--t,那么只要目标权限中包含s或t就符合条件 # 如果使用的是 -7000 则目标文件要包含 ---s--s--t 的全部三个权限才符合条件
其他可进行的操作
参数说明
-exec command:command为其他命令,-exec后面可接其他的命令来处理查找到的结果(这个命令不支持别名) -print:将结果打印到屏幕上,这个操作是默认操作
举个栗子
# 查找系统中所有含有SGID、SUID或SBIT属性的文件,并使用ls -l 列出详细信息 find /-perm +7000 -exec ls -l {} \
该例中有两个特殊的地方,{} 以及 \
- {}:代表的是由find找到的内容
- \:它是一个关键字,可以理解为 -exec 参数的结束标识符。在-exec 和 ** 之间的便是find命令内的额外命令。它用另一个命令来处理find的执行结果