【Linux】比较几个文件查找命令 find-locate-whereis-which

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设置的目录里查找

猜你喜欢

转载自blog.csdn.net/lijing742180/article/details/83661364
今日推荐