linux下查找文件的相关命令
运行环境:centos7
参考来源:man、鸟哥入门书籍
一、脚本文件查找:which/type
1. which
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变量指示的路径中,所以查找不到。
2. type
查询命令是Bash shell内置命令,还是外部非bash命令。
命令:type [-tpa] name
- -t:此时输出结果会以下列关键词显示name的类型
- builtin:bash内置命令
- alias: 命令别名
- file: 外部命令
- keyword:shell保留字
- function:shell函数
- 空:没有找到该name
- -p:如果name是外部命令,才会显示完整文件名。
- -a:根据PATH中的路径,将所有符合name的命令列出,包括alias、builtin、function
- 其他参数:-P、-f
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/lsygy@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/locate/find
1. whereis
whereis 用于搜索二进制文件、源文件、manual页面文件。man说明页面中提到,会去除所提供名称的前缀和后缀。并且默认是在linux标准空间(?)、PATH和MANPATH(此环境变量为什么是空的?)中定位要查询的程序。
whereis -[bmsu] name
- -l:列出whereis去查询哪些目录。未指定-B/-M/-S时,会输出whereis能够在文件系统找到的所有硬编码路径。
- -b:只找二进制文件
- -m:只找在说明文件manual路径下的文件
- -s:只找源文件
- -u:查找有特殊条目的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是与上述两个目录等价,所以应该没有影响。
2. locate/updatedb
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…
- -i:–ignore-case,忽略大小写差异。
- -r:–regexp REGEXP。若使用该选项,没有PATTERN。此选项可被指定多次。
- -c:–count,输出匹配的条目个数,而不是输出匹配PATTERN的结果。
- -S:–statistics,输出locate所使用的相关数据库信息。
- -l:–limits,-n LIMIT。表示在找到LIMIT条匹配数据后成功退出该命令的执行。
[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 字节用于存储数据库
3. find
find [path…] [expression]
其中表达式由:选项option、动作action组成。
第一个以 ‘-’ , ‘(’ , ‘)’ , ‘,’ 或 ‘!’ 这些字符起始的参数是表达式的开始;
在它之前的任何参数是要搜索的路径,在它之后的任何参数都是表达式的余下部分。如果没有路径参数,缺省用当前目录。
1. 与时间有关的选项
以mtime为例:
- -mtime n:n天前的一天之内被修改过内容的文件。
- -mtime +n:n天前(不包括n天本身)被修改过内容的文件。
- -mtime -n:n天之内(包括n天)被修改过内容的文件。
[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:修改时间,文件内容最后一次被修改的时间。
2. 与使用者/用户组名称有关的选项
- -uid n:/etc/passwd中的UID
- -gid n:/etc/group中的GID
- -user name:name为使用者账号的名称。
- -group name:用户组名称。
- -nouser:查找文件的拥有者不在/etc/passwd中
- -nogroup:查找文件的用户组不在/etc/group中
3. 与文件权限、名称有关的参数
- -name filename:查找名为filename的文件。
- -size [±]SIZE:查找比SIZE要大(+)/ 小(-)的文件。SIZE的单位:c,字节;k,kb。
- -type TYPE。TYPE类型有:
- f:正规文件
- b,c:设备文件
- d:目录
- l:链接文件
- s:socket
- p:FIFO
- -perm 权限:
- mode:查找文件权限刚好等于mode的文件。如-rwsr-xr-x,应该使用-perm 4755。
- -mode:大于等于mode的文件。
- /mode:包含任一mode的权限的文件。
如:查找比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
4. 其他
-exec command:接额外的命令command来处理查找到的结果。
[wkm@WkmCentosHost ~]$ find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
{}:代表find查找到的内容,即将find找到的内容放在{}处
\; -exec一直到\;是关键字,表示find额外操作的开始(-exec)至结束(\;),因为bash中的
;
有特殊含义所以用反斜杠转义。