linux下查找文件的相关命令

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/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/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

关于时间:
linux下查找文件的相关命令_第1张图片

-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中的;有特殊含义所以用反斜杠转义。

你可能感兴趣的:(#,Linux,linux,运维,服务器)