文件查找就很厉害了,因为我们常常需要知道哪个文件放在哪里,才能够对该文件进行一些修改或维护等等的操作,有时候某些软件配置文件的文件名是不变的,但是各Linux发行版放置的目录则不同,此时就需要利用一些查找命令将该配置文件的完整文件名找出来,这样才能够修改他
我们知道在命令行模式当中,连续输入两次[TAB]按键就能够知道提示命令,那你知道这么命令的完整文件名放在哪里吗?举个例子,例如cat,这个常用的命令放在哪里?那我们就可以通过which命令来查找
在 Linux 系统中,which 命令用于查找可执行文件的路径。它会在环境变量 $PATH 指定的路径中查找指定的命令,并输出该命令的可执行文件路径。
[root@localhost ~]# $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
使用 which 命令的语法格式如下:
which [-a] command
# command 表示要查找的命令名,options 表示可选参数
选项:
-a:显示所有符合条件的命令路径,而不是只输出第一个命令的路径。
假设我们要查找命令 python的可执行文件路径,可以使用如下命令:
[root@localhost ~]# which python
/usr/bin/python
# 该命令会在 $PATH 环境变量指定的路径中查找 python
查看所有匹配到的路径
[root@localhost ~]# which -a mkdir
/usr/bin/python
# 该命令会返回所有匹配到的python可执行文件路径
用which去招出which的文件名是什么?
[root@localhost home]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/alias
/usr/bin/which
# 当你执行"which which"命令时,系统会在$PATH路径中查找which命令的路径,并输出到终端。但是,由于which命令被设置为一个别名,它实际上是一个shell内置命令,而不是一个独立的可执行文件。因此,使用"which which"命令查找which命令的实际路径时,会输出该别名的定义,而不是which命令的路径。
在这种情况下,如果你想确定which命令的实际路径,可以使用"type which"命令,它会输出which命令的类型,例如是一个可执行文件还是一个别名。如果which命令是一个别名,你可以使用"alias which"命令查看该别名的定义。
type命令是一个用于查找命令类型的工具,它可以用来查询系统中某个命令的类型,即是一个可执行文件、内置命令、别名、shell函数等。type命令的语法如下:
type [-afptP] name
# name是要查询类型的命令名称
# 选项
-a:显示所有符合条件的命令,而非只显示第一个;
-f:仅显示文件名;
-p:仅显示找到的第一个可执行文件的完整路径;
-t:仅显示命令类型;
-P:指定要查找的命令路径前缀。
type命令会根据命令类型的不同,输出不同的信息
如果命令是一个可执行文件,type命令会输出该文件的完整路径
如果命令是一个内置命令,type命令会输出"builtin"
如果命令是一个别名,type命令会输出该别名的定义
如果命令是一个shell函数,type命令会输出该函数的定义
如果命令不存在,type命令会输出"not found"
举个例子
执行"type cd"命令会输出"cd is a shell builtin",因为cd是一个shell内置命令
执行"type ls"命令会输出"ls is /usr/bin/ls",因为ls是一个可执行文件
执行"type which"命令会输出"which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde,因为which是一个别名
Linux也有相当优异的查找命令,例如find,locate,whereis命令,我们一般都使用 locate和whereis来查找,为什么不用find呢?因为find不恨常用,除速度慢之外也很影响硬盘性能,whereis只找系统中某些特定目录下的文件而已,locate则是利用数据库来查找文件名,二者查找起来就相当的快速,其实这两个命令并没有实际查找硬盘内的文件系统状态,所以比较节省时间
whereis 命令可以用于查找指定命令的二进制文件、帮助文件和源代码文件的路径。它只能查找系统中已经安装的软件,而且只能查找特定类型的文件
简而言之就只能查找特定类型的文件
whereis 命令的基本语法如下:
whereis [-bmsu] 文件或目录名
选项:
-l 可以列出whereis会取查询的几个主要目录
-b 只查找二进制格式的文件
-m 只查找说明文件manual路径下的文件
-s 只查找source源文件
-u 查找不在上个三个项目当中的其他特殊文件
请找出cat这个文件名
[root@localhost ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz
只找出passwd相关的【说明文件】
[root@localhost ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz
locate 和 updatedb 命令是 Linux 系统中常用的文件查找命令。其中,locate 命令用于在文件索引数据库中查找文件,速度快但是可能不是最新的;updatedb 命令用于更新文件索引数据库,以便 locate 命令可以查找到最新的文件。
locate 命令的基本语法如下:
locate [-ir] 需要查找的文件名关键字
选项:
-i 忽略大小写
-c 不输出文件名,仅计算找到的文件数量
-l 仅输入几行的意思,例如输出5行 就是-l 5
-S 输入locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
-r 使用正则表达式进行匹配
找出系统中所有与passwd相关的文件名,且只列出5个
[root@localhost ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/opt/centos/Packages/passwd-0.79-6.el7.x86_64.rpm
查询所使用的数据库文件和文件名以及各数数据数量
[root@localhost ~]# locate -S
数据库 /var/lib/mlocate/mlocate.db:
4,641 文件夹
39,197 文件
1,739,831 文件名中的字节数
884,125 字节用于存储数据库
可以看出locate的使用更简单,直接在后输入文件的部分名称后,就能够得到结果,尤其是你忘记完整的文件名时,通过搜索这样能够大大提高我们的工作效率。
但是你会发现locate在使用上面还是有限制的,为什么呢?你会发现使用locate来寻找数据特别快,这是因为locate寻找的数据是由已建立的数据库 /var/lib/mlocate/ 里面的数据所查到的,所以不要直接再去硬盘当中去读取数据,就这是locate快的原因
那么有什么限制呢?因为他是经过数据库来查找的,而数据库的建立默认是在每天执行一次(每个发行版不一样,Centos7.x是每天更新数据一次),所以当你新建立起来的文件,却还在数据库更新之前查找该文件,那么locate会告诉你找不到,这时候我们就要用到了updatedb命令
updatedb 命令用于更新文件索引数据库,以便 locate 命令可以查找到最新的文件
使用方法有很简单
updatedb
# 就可以更新了!
find [path] [option] [action]
# path 表示要查找的起始路径,可以是绝对路径或相对路径;
# option 表示选项参数
# action 表示查找条件,可以是文件名、大小、权限等。
选项与参数:
与时间有关的选项:共有-atime,-ctime与-mtime,以mtime说明
选项 | 解释 |
---|---|
-mtime n | n为数字,意义为在n天之前的【一天之内】被修改过内容的文件 |
-mtime +n | 列出在n天前(不含n天本身)被修改过内容的文件 |
-mtime -n | 列出在n天内(含n天本身)被修改过内容的文件 |
-newer file | file为一个存在的文件,列出比file还要新的文件 |
使用案例
将过去系统上面24小时内有修改过内容(mtime)的文件列出
find / -mtime 0
# 那个0是重点,0代表目前的时间,所以,从现在开始到24小时前
有变动的文件都会被显示,那如果三天前那一天的24小时内呢?
find / -mtime 3
# 3天前的当天有发生改变的文件都会显示
寻找/etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
find /etc -newer /etc/passwd
# newer用于辨别两个文件的新旧关系还是有点用的
以上就是时间参数选项的使用案例,如果你想要找出一天内被修改的文件,可以使用上述命令。但是如果想要找出4天前被修改过的文件?那可以使用find /etc -mtime -4
,那如果是4天前的那一天就可以用find /etc -mtime 4
,有没有加上[ + ,-]差别很大。我们可以用简单的图例来说明一下。
图中最右边为目前时间,越往左边则代表越早时间
find /etc -mtime +4
find /etc -mtime -4
find /etc -mtime 4
选项参数:
选项参数 | 解释 |
---|---|
-uid n | n为数字,这个数字是使用者的账户ID,即为UID,这个UID是记录在/etc/passwd里面 |
-gid n | n为数字,这个数字是用户组的名称的ID,即为GID,这个GID记录在/etc/group 里面 |
-user name | name为使用者账号的名称 例如 csq |
-group name | name为用户组名称 例如 admin,user |
-nouser | 查找文件中拥有者不在/etc/passwd 中的 |
-nogroup | 查找文件的拥有用户组不存在于 /etc/group的文件 |
使用案例
查找/home 下面属于zhw的文件
find /home -user zhw
# 这个命令很有用,当我们要找出任何一个用户在系统中的所有文件时,就可以利用这个命令
查找系统中不属于任何人的文件
find / -nouser
# 通过这个命令就可以找出那些不太正常的文件,如果有找到不属于任何系统任何用户的文件时,那是正常,除了你自行在网络上面下载文件时会发生意外,还有就是系统某个账号删除了,但是账号里面有很多文件,就会发送这种情况文件不属于任何人任何系统,这时就可以通过上述命令来进行查看
选项与参数
选项与参数 | 解释 |
---|---|
-name filename | 查看文件名称为filename的文件 |
-size [+ -]SIZE | 查找比SIZE还要大(+)或小(-)的文件 |
-type TYPE | 查找文件的类型为TYPE的 |
-perm mode
:查找权限为指定mode的文件,例如,find /etc -type f -perm 644
表示查找权限为rw-r–r–的文件。-perm -mode
:查找权限包含指定mode的文件,,find /etc -type f -perm -022
表示查找权限包含其他用户可读写的文件。-perm /mode
:查找权限包含指定mode任意一位的文件。例如,find /etc -type f -perm /4000
表示查找权限包含SUID位的文件。-perm +mode
:查找权限包含指定mode的所有位的文件。例如,find /etc -type f -perm +700
表示查找权限包含用户可读写执行的文件。使用案例
找出文件名位passwd的这个文件
find / -name passwd
找出文件名包含了passwd这个关键字的文件
find / -name "*passwd*"
找出系统中,大于1MB的文件
find / -size +1M
找出/run目录下,文件类型位socket的文件名有哪些?
find /run -type s
# type类型主要有:一般正规文件(f),设备文件(b,c),目(d),链接文件(l),socket(s),及FIFO(p)等属性
查找权限为rw-r–r–的所有文件:
find /usr/bin -type f -perm 644
查找权限包含其他用户可读写的文件:
find /usr/bin -type f -perm -022
查找权限包含SUID位的文件:
find /usr/bin -type f -perm /4000
查找权限包含用户可读写执行的文件:
find /etc -type f -perm +700
注意,权限参数中的mode是一个3位八进制数,其中每一位表示不同的权限,分别是读(r)、写(w)和执行(x),取值为0或1,其中0表示无该权限,1表示有该权限。例如,644表示rw-r–r–,755表示rwxr-xr-x。使用find命令的权限参数时,应该注意权限格式的正确性,以及权限的含义。
选项参数
-exec command {} \;
:对查找到的每个文件执行指定的命令,其中command表示命令,任何{}表示查找到的文件名,;表示命令结束,【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义
-print
:将查找到的文件名输出到标准输出(通常是终端)。这是find命令默认的操作,如果不指定其他操作,则会输出所有查找到的文件名。
使用案例
找目录/etc下所有扩展名为.txt的文件,并删除它们
find /etc -type f -name "*.txt" -exec rm -rf {} \;
查找目录/etc下所有扩展名为.txt的文件,并将它们的文件名输出到标准输出
find /etc -type f -name "*.txt" -print
1. find命令:
优点:可以通过多种条件(如文件名、大小、修改时间等)进行高级文件查找,灵活性较高。
缺点:查找速度较慢,因为需要递归遍历目录。
2. whereis命令:
优点:查找速度非常快,因为只搜索特定的系统目录(/usr/bin、/usr/sbin等)。
缺点:只能查找二进制文件和对应的man手册,不能查找其他类型的文件,且结果有限制。
3. which命令:
优点:查找速度快,结果直观,可以显示找到的第一个可执行文件的路径。
缺点:只能查找在系统路径中($PATH环境变量指定的目录)的可执行文件,而且无法查找其他类型的文件。
4. locate命令:
优点:查找速度快,因为使用了预先建立的索引数据库,在大型系统中查找非常有效。
缺点:由于使用了预先建立的索引数据库,所以需要更新索引,否则可能无法找到最新创建的文件,且无法查找未被索引的目录。
5. type命令:
优点:查找速度快,可以查找可执行文件、命令别名、shell内置命令、函数等。
缺点:只能查找系统已知的命令和函数,不能查找其他类型的文件,且不能查找自定义的命令别名。
如果需要高级文件查找,可以使用find命令;如果需要快速查找系统命令,可以使用whereis、which或type命令;如果需要在大型系统中查找文件,可以使用locate命令
本文参考《鸟哥的Linux私房菜》这本书