find命令是Linux下最常用的命令之一,灵活的使用find命令,你会发现查找文件变得十分简单。

命令格式

find [指定查找目录]  [查找规则(选项)]  [查找完后执行的动作]

参数规则

-name 按照文件名查找文件
-iname 根据文件名查找,但是不区分大小写
-perm 按照文件权限来查找文件
-prune 使用这一选项可以使find命令不在当前指定的目录中查找

-user 根据属主来查找文件
-group 根据属组来查找文件

-uid 根据uid来查找文件
-gid 根据gid来查找文件

关联条件的使用
-a 连接两个不同的条件(两个条件必须同时满足)
-o 连接两个不同的条件(两个条件满足其一即可)
-not 对条件取反的

根据文件时间戳的相关属性来查找文件
-mmin n 文件最后一次修改是在n分钟之内
-mtime n 文件最后一次修改是在 n*24小时之内
find /tmp –atime +5 表示查找在五天内没有访问过的文件

-amin n 文件最后一次访问是在n分钟之内
-atime n 文件最后一次访问是在 n*24小时之内

-cmin n 文件的状态在n分钟内被改变
-ctime n 文件状态在n*24小时内(也就是n天内)被改变

-type 根据文件类型来查找文件

f // 普通文件
d //目录文件
l //链接文件
b //块设备文件
c //字符设备文件
p //管道文件
s //socket文件

-size 根据大小来查找文件

-perm 根据文件权限查找文件

-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件

查找完执行
-print 默认情况下的动作
-ls 查找到后用ls 显示出来
-ok [commend] 查找后执行命令的时候询问用户是否要执行
-exec [commend] 查找后执行命令的时候不询问用户,直接执行

-nouser and -nogroup 在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,应该及时清除)

相关命令

locate命令,locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
whereis命令,在特定目录中查找符合条件的文件。和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

which命令,which是通过 PATH环境变量到该路径内查找可执行文件,基本功能是寻找可执行文件。
type命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。

场景范例

1. 用文件名查找文件

这是find命令的一个基本用法。
# find -name "nginx.conf"

2.用文件名查找文件,忽略大小写
# find -iname "nginx.conf"

3. 使用mindepth和maxdepth限定搜索指定目录的深度
在root目录及其子目录下查找passwd文件。

# find / -name passwd
在root目录及其1层深的子目录中查找passwd. (例如root — level 1, and one sub-directory — level 2)

# find -maxdepth 2 -name passwd
在root目录下及其最大两层深度的子目录中查找passwd文件. (例如 root — level 1, and two sub-directories — level 2 and 3 )

# find / -maxdepth 3 -name passwd
在第二层子目录和第四层子目录之间查找passwd文件。

# find -mindepth 3 -maxdepth 5 -name passwd

4. 查找后指令,在find命令查找到的文件上执行命令

下面的例子展示了find命令来计算所有不区分大小写的文件名为“MyCProgram.c”的文件的MD5验证和。{}将会被当前文件名取代。

find -iname "MyCProgram.c" -exec md5sum {} \;
5.相反匹配

显示所有的名字不是MyCProgram.c的文件或者目录。由于maxdepth是1,所以只会显示当前目录下的文件和目录。

find -maxdepth 1 -not -iname "MyCProgram.c"

6. 使用inode编号查找文件

任何一个文件都有一个独一无二的inode编号,借此我们可以区分文件。创建两个名字相似的文件,例如一个有空格结尾,一个没有。

从ls的输出不能区分哪个文件有空格结尾。使用选项-i,可以看到文件的inode编号,借此可以区分这两个文件。

你可以如下面所示在find命令中指定inode编号。在此,find命令用inode编号重命名了一个文件。

find -inum 16187430 -exec mv {} new-test-file-name \;

7. 根据文件权限查找文件

找到对组用户具有只读权限的文件。

find . -perm g=r -type f -exec ls -l {} \;

8. 找到home目录及子目录下所有的空文件(0字节文件)

下面命令的输出文件绝大多数都是锁定文件盒其他程序创建的place hoders

find ~ -empty
只列出你home目录里的空文件。

find . -maxdepth 1 -empty

只列出当年目录下的非隐藏空文件。

find . -maxdepth 1 -empty -not -name ".*"
9. 查找5个最大的文件

下面的命令列出当前目录及子目录下的5个最大的文件。这会需要一点时间,取决于命令需要处理的文件数量。

find . -type f -exec ls -s {} \; | sort -n -r | head -5
10. 查找5个最小的文件

方法同查找5个最大的文件类似,区别只是sort的顺序是降序。

find . -type f -exec ls -s {} \; | sort -n | head -5
上面的命令中,很可能你看到的只是空文件(0字节文件)。如此,你可以使用下面的命令列出最小的文件,而不是0字节文件。

find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5

11. 使用-type查找指定文件类型的文件

只查找socket文件
find . -type s
查找所有的目录
find . -type d
查找所有的一般文件
find . -type f
查找所有的隐藏文件

find . -type f -name ".*"
查找所有的隐藏目录

find -type d -name ".*"
12. 通过和其他文件比较修改时间查找文件

显示在指定文件之后做出修改的文件。下面的find命令将显示所有的在ordinary_file之后创建修改的文件。
# find -newer ordinary_file

13. 通过文件大小查找文件
使用-size选项可以通过文件大小查找文件。
查找比指定文件大的文件

find ~ -size +100M
查找比指定文件小的文件

find ~ -size -100M
查找符合给定大小的文件

find ~ -size 100M
注意: – 指比给定尺寸小,+ 指比给定尺寸大。没有符号代表和给定尺寸完全一样大。

14. 给常用find操作取别名

若你发现有些东西很有用,你可以给他取别名。并且在任何你希望的地方执行。
常用的删除a.out文件。

alias rmao="find . -iname a.out -exec rm {} \;"
# rmao
删除c程序产生的core文件。

alias rmc="find . -iname core -exec rm {} \;"
# rmc

15. 用find命令删除大型打包文件
下面的命令删除大于100M的*.zip文件。
find / -type f -name *.zip -size +100M -exec rm -i {} \;"

16.找到在1个小时内被更改的文件
find -mmin -60


或者
find -mtime -1
17.找到1个小时内被访问过的文件
# find . -amin -60

18.查找一个小时内状态被改变的文件
# find . -cmin -60

19.搜索仅仅限定于文件,不显示文件夹
# find / -name "*.log"
# find / -xdev -name "*.log"

20.仅仅查找非隐藏的文件(不显示隐藏文件)
如果我们查找的时候不想隐藏文件也显示出来,可以使用下面的正则式查找:
下面的命令会显示当前目录及其子目录下15分钟内文件内容被修改过的文件,并且只列出非隐藏文件。也就是说,以.开头的文件时不会显示出来的
# find / -xdev -name "*.log"
21.查找文件修改时间在某一文件修改后的文件
# find -newer /etc/passwd
22.仅仅在当前文件系统中搜索
下面这个命令会搜索根目录/及其子目录下所有.log结尾的文件名。如果你有多个分区在/下面,那么这个搜索会去搜索所有的被挂载的分区:
# find / -name "*.log"
如果我们使用-xdev选项,那么仅仅会在在当前文件系统中搜索,下面是在xdev的man page上面找到的一段-xdev的定义:
-xdev Don’t descend directories on other filesystems.
下面的命令会在/目录及其子目录下搜索当前文件系统(也就是/挂载的文件系统)中所有以.log结尾的文件,也就是说如果你有多个分区挂载在/下面,下面的搜索不会去搜索其他的分区的(比如/home/)
# find / -xdev -name "*.log"

参考 Linux的五个查找命令 阮一峰

      15个实用的Linux find命令示例

菜鸟学Linux命令:find命令 查找文件的更多相关文章

  1. 菜鸟学Linux命令:chmod命令和数字文件权限

    chmod是一条在Unix系统中用于控制用户对文件的权限的命令(change mode单词前缀的组合)和函数.只有文件所有者和超级用户可以修改文件或目录的权限.可以使用绝对模式,符号模式指定文件的权限 ...

  2. 菜鸟学Linux命令:ssh命令 远程登录

    1.查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用Op ...

  3. 菜鸟学Linux命令:grep配合ls等使用

    linux grep命令 (global search regular expression(RE) and print out the line )是一种强大的文本搜索工具,它能使用正则表达式搜索文 ...

  4. Linux中常用的查找文件的命令

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.这些是从网上找到的资料(参考资料1),因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用. w ...

  5. 菜鸟学Linux命令:tar命令 压缩与解压缩

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件. tar最初被用来在磁带上创建档案,现在,用户可以 ...

  6. 菜鸟学Linux命令:tail命令 查看日志

    tail 命令用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理. tail命令常用来查看日志文件.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filenam ...

  7. 菜鸟学Linux命令:bg fg jobs命令 任务管理

    jobs命令 jobs命令用于查看当前终端后台运行的任务 注意和ps的区别: ps命令用于查看瞬间进程的动态 通过一个实例可以理解它们之间的区别,依次执行如下命令:vim & //后台执行vi ...

  8. 每天学习一个命令:find 查找文件

    查找的动作在平时使用的频率也还是很高的,所以知道并用好 find 这个命令也很重要.find 命令顾名思义,就是搜索特定文件夹内的文件. 基本使用 最基本的使用 find [path] [expres ...

  9. linux系统中批量查找文件与文件内容的方法

    在linux中查看与修改文件权限我们都必须使用命令来操作,不能像windows一样点几下就好了,下面我们简单的介绍一下linux中的相关命令 比如查找当前目录下面所有的php文件里面某个关键字 fin ...

随机推荐

  1. js中日历的代码

    Html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  2. JavaScript模块化学习基础

    http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 一.原始写法 模块就是实现特定功能的一组方法. 不同函数简单放在一起就算一个 ...

  3. 将对象转为数组方法:延伸array_map函数在PHP类中调用内部方法

    public static function objectToArray($d) { if (is_object($d)) { $d = get_object_vars($d); } if (is_a ...

  4. struts2.3.16所需的基本的jar包

    jar包放多了就报Exception什么Unable to load....上网搜了半天也没有能解决的 下面所说的jar包放到WEB-INF/lib以及tomcat/lib中 通过我一个一个添加到to ...

  5. C#多线程学习 之 线程池[ThreadPool](转)

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  6. Responsive设计的十个基本技巧(转)

    什么是Responsive设计?有的同学认为Responsive设计是自适应布局,也有的同学认为Responsive是网格布局.其实这些想法都不正确.Wikipedia对Responsive做 了详细 ...

  7. 3DES封装类

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Se ...

  8. 支付宝微信O2O大战,WiFi广告在夹缝中求生存

    支付宝微信O2O大战,WiFi广告在夹缝中求生存 来自工信部的数据显示,截至2013年底,中国智能手机的保有量已经达到5.8亿台.国内平均有46%的时间选择WiFi上网. 商用WiFi已经成为了移动互 ...

  9. 百度站长工具进击site结果页面[SITE特型]

    最近在度娘上site站点是不是发现多了一个应用展示框?没错!这就是度娘新推出的site特型,仔细看一下是百度站长平台的相关功能,作为目前国内市场占有率比较高的搜索引擎,百度站长工具进击site结果页面 ...

  10. 翻译:非常详细易懂的法线贴图(Normal Mapping)

    翻译:非常详细易懂的法线贴图(Normal Mapping) 本文翻译自: Shaders » Lesson 6: Normal Mapping 作者: Matt DesLauriers 译者: Fr ...