Linux系统中的 find 命令在查找文件时非常有用而且方便。它可以根据不同的条件来查找文件,例如权限、拥有者、修改日期/时间、文件大小等等。在这篇文章中,我们将学习如何使用 find 命令以及它所提供的选项来查找文件。

在绝大多数Linux发行版中,你都可以直接使用 find 命令而无需进行任何安装操作。如果你想在linux系统的命令行中变得特别高效,那么 find 是你必须掌握的命令之一。

find 命令的基本语法如下:

$ find [path] [option] [expression]

一、基本用法

1. 列出当前目录和子目录下的所有文件

这个命令会列出当前目录以及子目录下的所有文件。

$ find

.

./abc.txt

./subdir

./subdir/how.php

./cool.php

该命令与以下命令效果相同

$ find .

$ find . -print

2. 查找特殊的目录或路径

下面的命令会查找当前目录下 test 文件夹中的文件,默认列出所有文件。

$ find ./test

./test

./test/abc.txt

./test/subdir

./test/subdir/how.php

./test/cool.php

下面的命令用于查找指定名称的文件。

$ find ./test -name "abc.txt"

./test/abc.txt

也可以使用通配符

$ find ./test -name "*.php"

./test/subdir/how.php

./test/cool.php

请注意,所有的文件夹都会被递归地查找。所以,这是用于查找指定扩展名文件的一种非常强大的方式。

如果我们尝试搜索 / 文件夹,也就是根目录,就会搜索整个文件系统,包括挂载的设备以及网络存储设备。所以请小心使用。当然,你随时可以通过按 Ctrl + C 来终止命令。

注意:当指定文件夹的时候(例如示例中的"./test"文件夹),忽略末尾的斜杠是没有问题的。但是,如果文件夹是一个指向其它位置的链接(symlink)时,你必须在末尾写上斜杠才能使find命令正常工作(find ./test/)。

忽略大小写

在查找文件名时,忽略大小写往往非常有用。要忽略大小写,只需要使用 iname 选项,而不是 name 选项。

$ find ./test -iname "*.Php"

./test/subdir/how.php

./test/cool.php

总是用双引号或单引号来包围匹配模式(文件名参数),这非常有用。不这样做的话有时也能正常工作,有时也可能会产生奇怪的结果。

3. 限制目录查找的深度

find 命令默认会递归查找整个目录树,而这非常消耗时间和资源。好在目录查找的深度可以手动指定。例如我们只想查找一到两层以内的子目录,可以通过 maxdepth 选项来指定。

$ find ./test -maxdepth 2 -name "*.php"

./test/subdir/how.php

./test/cool.php

$ find ./test -maxdepth 1 -name *.php

./test/cool.php

第二个示例中指定了 maxdepth 为1,表明最多只查找一层内的子目录,也就是只查找当前文件夹。

当我们只想在当前目录下查找,而不是查找整个目录树的时候,这个选项会特别有用。

与 maxdepth 选项相似,还有一个选项叫做 mindepth ,正如名字所表示的那样,它会至少到达第 N 层子目录后才开始查找文件。

4. 反向查找

除了查找满足条件的文件之外,我们还可以查找不满足条件的所有文件。当我们知道要在查找中排除哪些文件时,这个选项就能发挥作用了。

$ find ./test -not -name "*.php"

./test

./test/abc.txt

./test/subdir

在上面的示例中我们找到了所有扩展名不是 php 的文件和文件夹。我们也可以使用感叹号 ! 来代替 -not。

find ./test ! -name "*.php"

5. 结合多个查找条件

我们可以同时使用多个查找条件来指定文件名并排除某些文件。

$ find ./test -name 'abc*' ! -name '*.php'

./test/abc.txt

./test/abc

上面的命令查找所有以 abc 开头并且不含 .php 扩展名的文件。这个示例展现了 find 命令自带的查找表达式是多么的强大。

OR 操作符

当我们使用多个查找条件时, find 命令会将它们通过 AND 操作符结合起来,也就是说,只有满足所有条件的文件才会被列出。不过,如果我们需要进行基于 OR 运算的查找时,可以加上 -o 开关。

$ find -name '*.php' -o -name '*.txt'

./abc.txt

./subdir/how.php

./abc.php

./cool.php

上面的命令查找所有以 .php 结尾或者以 .txt 结尾的文件。

6. 只查找文件或目录

有时我们只想通过某个名字查找对应的文件或对应的目录,我们可以很容易实现这个要求。

$ find ./test -name abc*

./test/abc.txt

./test/abc

只查找文件

$ find ./test -type f -name "abc*"

./test/abc.txt

只查找目录

$ find ./test -type d -name "abc*"

./test/abc

非常有用而且方便!

7. 同时在多个目录下查找

如果你想要在两个不同的目录内进行查找,命令非常简单。

$ find ./test ./dir2 -type f -name "abc*"

./test/abc.txt

./dir2/abcdefg.txt

检查一下,它确实列出了来自给定的两个目录的文件。

8. 查找隐藏文件

在Linux系统中,隐藏文件的名字以英文的句号开头,即 . 。所以要列出隐藏文件,只需加上简单的文件名过滤条件就行了。

$ find ~ -type f -name ".*"

二、基于文件权限和属性的查找

9. 查找指定权限的文件

通过指定 perm 选项,我们可以查找具有特定权限的文件。下面的示例中查找了所有具有 0664 权限的文件。

$ find . -type f -perm 0664

./abc.txt

./subdir/how.php

./abc.php

./cool.php

我们可以用这个命令来查找带有错误权限的文件,这些文件可能会产生安全问题。

可以结合 反向查找 来进行权限检查。

$ find . -type f ! -perm 0777

./abc.txt

./subdir/how.php

./abc.php

./cool.php

10. 查找具有 SGID/SUID 属性的文件

下面的命令查找所有具有 644 权限和 SGID 属性的文件。

# find / -perm 2644

我们同样可以使用 1664 来查找设置了 粘滞位 (sticky bit)的文件。

# find / -perm 1644

perm 选项除了接受数值型参数外,同样接受 chmod 命令中的模式串。在下面的查找中,我们用另一种语法来代替数字。

$ find / -maxdepth 2 -perm /u=s 2>/dev/null

/bin/mount

/bin/su

/bin/ping6

/bin/fusermount

/bin/ping

/bin/umount

/sbin/mount.ecryptfs_private

注意:由于权限不足,某些目录会拒接访问。命令中的 2>/dev/null 正是用于清除输出中的错误访问结果。

11. 查找只读文件

$ find /etc -maxdepth 1 -perm /u=r

/etc

/etc/thunderbird

/etc/brltty

/etc/dkms

/etc/phpmyadmin

... output truncated ...

12. 查找可执行文件

$ find /bin -maxdepth 2 -perm /a=x

/bin

/bin/preseed_command

/bin/mount

/bin/zfgrep

/bin/tempfile

... output truncated ...

三、基于文件拥有者和用户组的查找

13. 查找属于特定用户的文件

查找当前目录下,属于 bob 的文件。

$ find . -user bob

.

./abc.txt

./abc

./subdir

./subdir/how.php

./abc.php

在指定所属用户的同时,我们同样可以指定文件名。

$ find . -user bob -name '*.php'

很容易看出,我们可以通过增加过滤条件来缩小查找文件的范围。

14. 查找属于特定用户组的文件

# find /var/www -group developer

四、基于日期和时间的查找

除了上面介绍的查找条件外,另外一个非常棒的查找条件就是文件的修改和访问时间(日期)。当我们想要找出哪些文件在某段时间内被修改的时候,这个查找条件将会非常方便。我们来看几个例子。

15. 查找过去的第 N 天被修改过的文件

# find / -mtime 50

16. 查找过去的 N 天内被访问过的文件

# find / -atime -50

17. 查找某段时间范围内被修改过内容的文件

# find / -mtime +50 -mtime -100

18. 查找过去的 N 分钟内状态发生改变的文件

$ find /home/bob -cmin -60

19. 查找过去的 1 小时内被修改过内容的文件

# find / -mmin -60

20. 查找过去的 1 小时内被访问过的文件

# find / -amin -60

五、基于文件大小的查找

21. 查找指定大小的文件

$ find / -size 50M

22. 查找大小在一定范围内的文件

$ find / -size +50M -size -100M

23. 查找最大和最小的文件

我们可以将 find 命令与 ls 和 sort命令结合,从而找出最大或最小的文件。

下面的命令使用了 sort 命令的 -r 选项,也就是从大到小降序排列。经过 head 命令的过滤之后,会显示当前目录和子目录下最大的5个文件。命令的执行过程需要一段时间,查找的速度取决于文件的总数。

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

同样,我们可以去掉 sort 命令的 -r 选项来进行升序排列,从而显示出最小的5个文件。

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

24. 查找空文件和空目录

查找空文件:

# find /tmp -type f -empty

查找空目录:

$ find ~/ -type d -empty

非常简单!

六、高级操作

find 命令不仅可以通过特定条件来查找文件,还可以对查找到的文件使用任意linux命令进行操作。下面给出两个例子。

25. 使用 ls 命令列出文件信息

我们使用 find 命令找到文件后,只能看到文件路径。如果想进一步查看文件信息,可以结合 ls 命令来实现。

$ find . -exec ls -ld {} \;

drwxrwxr-x 4 enlightened enlightened 4096 Aug 11 19:01 .

-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./abc.txt

drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:48 ./abc

drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:26 ./subdir

-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:26 ./subdir/how.php

-rw-rw-r-- 1 enlightened enlightened 29 Aug 11 19:13 ./abc.php

-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./cool.php

26. 删除找到的文件

下面的命令会删除 tmp 目录下扩展名为 .txt 的文件。

$ find /tmp -type f -name "*.txt" -exec rm -f {} \;

我们同样可以删除目录,只要把 -type 后面的 f 改为 d ,并且在 rm 命令后面加上 -r 即可。

$ find /tmp -type d -name "dirToRemove" -exec rm -r -f {} \;

本文由 Wray 翻译,略有删改。考虑到原文有个别错误,以及为便于读者理解,故采用意译的方式。不足之处请大家指出,谢谢。

php 中find,Linux中find命令的用法汇总相关推荐

  1. xshell 6 连接debian系统拒绝了密码_Xshell中操作Linux的常用命令,你知道几个?

    作为IT人员,想必都知道Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.Xshell作为专业的终端模拟器,可以用 ...

  2. xshell中查找命令_Xshell中操作Linux的常用命令

    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.Xshell作为专业的终端模拟器,可以用来登录Linux,从而通 ...

  3. linux的nohup命令的用法。

    linux的nohup命令的用法. 在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/ ...

  4. linux命令 删除alias,Linux下alias命令的用法介绍

    本篇文章给大家带来的内容是关于Linux下alias命令的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 最近在使用ssh连接远程机器敲了类似ssh -i ~/.ssh/13 ...

  5. linux下tail命令的用法,tail命令_linux tail命令的用法

    摘要 腾兴网为您分享:linux tail命令的用法,央视影音,天猫超市,腾讯爱玩,水印相机等软件知识,以及分身多开,爱我大兴,安卓投屏电脑软件,拓客神器,新疆社区,splitit,iphone4s短 ...

  6. linux的tar中ztvf,linux中的tar命令(2)

    实例4:只将 /tar 内的 部分文件解压出来 命令: tar -zxvf /opt/soft/test/log30.tar.gz log2013.log 输出: [root@localhost te ...

  7. linux下tail命令的用法,在Linux命令中tail的用法

    linux中的tail命令用途是按照要求将指定的文件的最后部分输出到标准设备,一般是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail会自动刷新,确保你看到最新的档案 ...

  8. linux命令中info,Linux中zipinfo命令起什么作用呢?

    摘要: 下文讲述Linux中zipinfo的功能说明,如下所示: zipinfo(zip information的英文缩写) zipinfo命令功能: 用于输出压缩文件信息, 返回压缩文件的详细信息 ...

  9. linux中chmod命令的用法,【linux】chmod命令详细用法

    功能说明: 变更文件或目录的权限 u:User,即文件或目录的拥有者. g:Group,即文件或目录的所属群组. o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围. a:Al ...

最新文章

  1. ubuntu php7 memcache,linux ubuntu下安装php memcache扩展
  2. Linux服务器运维安全策略
  3. 安徽省级办公室高级应用计算机二级,2019年9月安徽省计算机等级二级考试教程:二级MSOffice高级应用上机指导...
  4. 安卓好用极简的telnet工具
  5. 三菱PLC Q系列经典大型12轴Q01U 实际使用中程序,详细中文注释
  6. win10 AD15 安装步骤
  7. 有限单元法基本原理和数值方法_有限元法基本原理
  8. 优秀的程序员真的不写注释吗?
  9. 返回结果集Result类
  10. 如何下载网页上的视频
  11. 普通人创业,不开实体店或者网上店铺,你能干啥?
  12. java 串口 中文乱码_Java 实现 POS 打印机无驱串口打印(解决中文乱码)
  13. 这两天看了一部剧,很早的片子,叫蜗居,感觉现在的自己现在的心境去看,能看到不一样的内容
  14. 正版授权|FastStone Capture 专业屏幕截图录屏工具软件 商业版,支持商业用途。
  15. 百度统计的相关知识和代码展示
  16. KVM虚拟化技术的-虚拟网卡
  17. 老师计算机组合照说说,有关老师的说说
  18. 拓扑排序 【Kahn算法】时间复杂度 V*V + E (个人认为)
  19. TYPE-C Docking, Hub, TYPE-C 到 HDMI/DP/VGA 转换器,任天堂Switch游戏机底座PD方案讲述
  20. 生产内存溢出,通过jprofiler对dump文件进行分析

热门文章

  1. 【OpenCV 4开发详解】图像二值化
  2. Android studio 真机联调闪退
  3. PyQt5+eric6之旅(四) - 信号与槽的绑定
  4. java中@Qualifier(string)是什么用法
  5. javascript的typeof返回哪些数据类型
  6. Quickhit快速击键
  7. 大数据实验室(大数据基础培训)——基础概念
  8. GdiPlus[6]: 五种画刷总览
  9. 在ASP.NET中备份和还原数据库
  10. (原创)用c++11打造好用的any