Linux中的文件查找命令很多,今天先学习一下find、locate 、whereis、which。
先看一下这几个命令的主要区别:
linux命令中find、locate 、whereis、which均可用来查找文件,主要区别有:
- find是最常用和最强大的查找命令。它能做到实时查找,精确查找,但查找内容较多时速度慢;
- locate查找速度快,但是不是实时查找,所以查找的结果不精确;
- whereis用于查找二进制文件、源代码文件和man手册页;
- which指令会在环境变量$PATH设置的目录里查找符合条件的文件。
一、find 查找文件
find命令很强大,用来在指定目录下查找文件。
任何位于参数之前的字符串都将被视为欲查找的目录名。
如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
1、语法
find path -option [ -print ] [ -exec -ok command ] {} \;
2、参数说明
find 根据下列规则判断 path 和 expression:
在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。
如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
(expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。)
-cmin n : 在过去 n 分钟内被修改过
-ctime n : 在过去n天内被修改过的文件
-mtime n:在过去 n 天内被修改过---(跟上面两个选项的区别见下面)
-mmin n:在过去 n 分钟内被修改过
-empty : 空的文件,寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-ipath p, -path p : 匹配文件路径,ipath 会忽略路径大小写
-name name, -iname name : 匹配文件名称。iname 会忽略名称大小写
-size n : 匹配文件大小,单位有:c--字节,k--千字节,M--兆字节,G--
-type c : 匹配文件类型,c是指定的类型。
文件类型参数有:f--普通文件,d--目录,l--符号链接
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
UNIX/Linux文件系统每个文件都有三种时间戳:
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
还可以使用 ( ) 将运算式分隔,并使用下列运算:
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
3、实例
(1)匹配文件名称
将当前目录及其子目录下所有.py后缀的文件列出来:
find . -name "*.py"
find . -iname "*.py" (同上,但忽略大小写,.PY后缀的文件也列出来)
当前目录及子目录下查找所有以.txt和.pdf结尾的文件:
find . \ ( -name "*.txt" -o -name "*.pdf" \ )
或
find . -name "*.txt" -o -name "*.pdf"
(2)匹配文件路径
匹配文件路径或者文件:
find /usr/ -path "*local*"
基于正则表达式匹配文件路径:
find . -regex ".*\ (\.txt\|\.pdf\)$"
(查找当前目录及子目录下所有以.txt或.pdf结尾的文件)
同上,但忽略大小写:
find . -iregex ".*\ (\.txt\|\.pdf\)$"
(3)否定参数!
找出/home下不是以.txt结尾的文件:
find /home ! -name "*.txt"
(4)匹配文件类型
将当前目录及其子目录中所有的一般文件列出:
find . -type f
(5)匹配文件时间戳
搜索最近七天内被 访问 过的所有文件:
find . -type f -atime -7
搜索恰好在七天前被 修改 过的所有文件:
find . -type f -mtime 7
搜索超过七天内被 修改 过的所有文件:
find . -type f -mtime +7
将目前目录及其子目录下所有最近 20 天内更新过的文件列出:
find . -ctime -20
(6)匹配文件大小
搜索大于10KB的文件:
find . -type f -size +10k
搜索小于10KB的文件:
find . -type f -size -10k
搜索等于10KB的文件:
find . -type f -size 10k
搜索所有长度为零的文件:
find . -empty
(7)删除匹配文件
删除当前目录下所有.txt文件:
find . -type f -name "*.txt" -delete
(8)借助-exec选项与其它命令结合使用
找出当前目录下所有root的文件,并把所有权更改为用户tom:
find .-type f -user root -exec chown tom {} \;
上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
找出自己家目录下所有的.txt文件并删除:
find $HOME/. -name "*.txt" -ok rm {} \;
上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中:
find . -type f -name "*.txt" -exec cat {} \;> all.txt
将30天前的.log文件移动到old目录中:
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来:
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令:
-exec ./text.sh {} \;
二、locate 查找文件
1、locate和find的区别
- locate命令也可以用于查找符合条件的文档或目录,但是速度比find快很多。
- locate查找命令简单,但功能也较少。
- locate 实际上查的是一个保存文档和目录名称的数据库,默认是/var/lib/slocate/slocate.db。
- find是去硬盘找,而locate这个数据库里找。
- locate的查找并不是实时的,而是以数据库的更新为准。
- Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库(也可以使用locate -u命令来更新)。
2、locate命令
直接locate fileName 即可查找指定文件,默认支持正则匹配。
locate passwd---查找出以passwd开头的所有文件
locate /data/jjing/test---查找出/data/jjing/目录下,所有以test开头的文件或文件夹下的所有内容
三、whereis和which的对比
whereis和which主要都是用来查找某个命令的位置。
但是which只查出对应的可执行命令的位置,whereis可以查出更多相关的内容。
直接看几个实例吧:
[app@VM_98_10_centos test]$ whereis mysql
mysql: /usr/bin/mysql /usr/lib64/mysql /usr/include/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
[app@VM_98_18_centos test]$ which mysql
/usr/bin/mysql
[app@VM_98_10_centos test]$ whereis python
python: /usr/bin/python /usr/bin/python2.6 /usr/bin/python2.6-config /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
[app@VM_98_10_centos test]$ which python
/usr/bin/python
[app@VM_98_18_centos test]$ whereis jenkins
jenkins:
[app@VM_98_18_centos test]$ which jenkins
/usr/bin/which: no jenkins in (/home/app/bin:/home/app/bin:/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/nemo/jdk8/bin:/nemo/gradle/bin:/home/app/bin:/nemo/jdk1.8.0_141/bin:/usr/local/python3.6.5/bin:/nemo/maven/bin)
[app@VM_98_18_centos test]$ whereis vim
vim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
[app@VM_98_18_centos test]$ which vim
/usr/bin/vim
- whereis一般用于查找系统的可执行命令的位置,以及相关的源码文件,及对应的man手册页;
- which也可以查找可执行命令的位置,但是只在环境变量$PATH设置的目录里查找