运行环境:centos7
参考来源:man、鸟哥入门书籍
man手册描述:
返回当前环境可以被执行的文件(或链接)的路径。搜索PATH变量匹配参数中的可执行文件,且不会规范化路径名称(?)
命令:
which [-a] 文件名
-a: 打印所有的匹配路径名
ygy@ubuntu:~$ which which
/usr/bin/which
## 只找出第一个
ygy@ubuntu:~$ which -a which
/usr/bin/which
/bin/which
## /usr/bin 是 /bin 的符号链接
ygy@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ygy@ubuntu:~$ which history
history是bash内置命令,不在path变量指示的路径中,所以查找不到。
查询命令是Bash shell内置命令,还是外部非bash命令。
命令:type [-tpa] name
ygy@ubuntu:~$ type ls
ls 是“ls --color=auto”的别名
ygy@ubuntu:~$ type -t ls
alias
ygy@ubuntu:~$ type -a ls
ls 是“ls --color=auto”的别名
ls 是 /usr/bin/ls
ls 是 /bin/ls
ygy@ubuntu:~$
ygy@ubuntu:~$ type cd
cd 是 shell 内建
ygy@ubuntu:~$ type -t cd
builtin
ygy@ubuntu:~$ type -a cd
cd 是 shell 内建
## 所以第一个which命令找不到cd
type找的是可执行文件名,如果不能以可执行文件的状态找到,不会有返回内容。因此 type 命令一般找的是 可执行文件, 而不是一般文件。
whereis 用于搜索二进制文件、源文件、manual页面文件。man说明页面中提到,会去除所提供名称的前缀和后缀。并且默认是在linux标准空间(?)、PATH和MANPATH(此环境变量为什么是空的?)中定位要查询的程序。
whereis -[bmsu] name
whereis -m -u *
表示查找当前路径下没有文档文件或有多个文档文件的文件。查找ls、tr的二进制文件和man页面,gcc的man页面
ygy@ubuntu:~$ whereis -bm ls tr -m gcc
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
tr: /usr/bin/tr /usr/share/man/man1/tr.1.gz
gcc: /usr/share/man/man1/gcc.1.gz
-B/-M/-S等选项,是限制将要搜索的name的搜索路径。如下实例中,在所有默认路径中寻找ls,在‘/usr/share/man/man1’中寻找cal
ygy@ubuntu:~$ whereis -m ls -M /usr/share/man/man1 -f cal
ls: /usr/share/man/man1/ls.1.gz
cal: /usr/share/man/man1/cal.1.gz
## -f选项:配合-B/-M/-S使用,具体作用尚不清楚,man的描述:终止目录列表,发出文件名信号(猜想:对于上述示例,取消默认路径查找,转而在/usr/share/man/man1中查找-f参数后接的`cal`)
在/usr/bin中查找没有记录在/usr/man/man1
,或者在/usr/src
中没有源代码的所有文件:
ygy@ubuntu:~$ cd /usr/bin
ygy@ubuntu:/usr/bin$ whereis -u -ms -M /usr/man/man1 -S /usr/src -f *
对比where -l 和 PATH内容,发现没有找/bin和/sbin,其他的路径-l选项都有显示。原因未知,但是/usr/bin和/usr/sbin是与上述两个目录等价,所以应该没有影响。
locate:是用于查找数据库(/var/lib/mlocate/)中匹配到的文件,不是像find一样直接在硬盘中查找,因此速度更快。
updatedb:由于数据库更新是定期的(CentOS是一天一次),查询前可以手动更新数据库:sudo updatedb(ubuntu上普通用户无权限),此时会根据/etc/updatedb.conf
的配置去查找硬盘文件,并更新到/var/lib/mlocate/
locate支持通配符,‘.’、‘/’不会特殊区分,也会包含在通配符内。
对于普通字符串的文件名,locate会显示数据库中所有匹配到该字符串的文件名。对于包含通配符,locate只会显示精准匹配到的文件名。man文档建议,在使用通配符时以*
开始,从而尽可能匹配到多的内容。
关于默认数据库的文件名、数据库更新频率、包含目录条目见updatedb
locate结果输出到终端:输出中的不寻常字符
locate [OPTION]… PATTERN…
[wkm@WkmCentosHost ~]$ locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/home/wkm/文档/testpw/passwd.nex
[wkm@WkmCentosHost ~]$ locate -S
数据库 /var/lib/mlocate/mlocate.db:
15,232 文件夹
169,300 文件
8,709,199 文件名中的字节数
3,922,880 字节用于存储数据库
find [path…] [expression]
其中表达式由:选项option、动作action组成。
第一个以 ‘-’ , ‘(’ , ‘)’ , ‘,’ 或 ‘!’ 这些字符起始的参数是表达式的开始;
在它之前的任何参数是要搜索的路径,在它之后的任何参数都是表达式的余下部分。如果没有路径参数,缺省用当前目录。
以mtime为例:
[wkm@WkmCentosHost ~]$ find /home/wkm/ -mtime 3
## 0代表当前时间,因此该命令的含义是:查找24小时内被修改过内容的文件
[wkm@WkmCentosHost ~]$ find /home/wkm/ -mtime 0
/home/wkm/
/home/wkm/.config/dconf
/home/wkm/.config/dconf/user
/home/wkm/.config/gtk-3.0
-atime:访问时间,文件最后一次被读取的时间。
-ctime:状态时间,文件的状态(权限、属性等)最近一次被修改的时间。
-mtime:修改时间,文件内容最后一次被修改的时间。
如:查找比1k小的文件
[wkm@WkmCentosHost ~]$ find ~ -size -1k
/home/wkm/.config/enchant/en_US.exc
/home/wkm/.config/enchant/en_US.dic
/home/wkm/.gnupg/secring.gpg
/home/wkm/.gnupg/pubring.gpg
....
## 查找名为passwd的文件(默认是完整文件名)
$ find / -name passwd
## 包含passwd的文件
$ find / -name "*passwd*"
## 查找类型为socket的文件
$ find /run -type s
## 查找包含SGID、SUID、SBIT的属性的文件
[wkm@WkmCentosHost ~]$ find / -perm /7000
-exec command:接额外的命令command来处理查找到的结果。
[wkm@WkmCentosHost ~]$ find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
{}:代表find查找到的内容,即将find找到的内容放在{}处
\; -exec一直到\;是关键字,表示find额外操作的开始(-exec)至结束(\;),因为bash中的
;
有特殊含义所以用反斜杠转义。