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

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

find 命令的基本语法如下:

phpfindonefind 的 26 个用法示例Linux上查找文件再也不消百度了 PHP

$ find [path] [option] [expression]

一、基本用法

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

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

$ find../abc.txt./subdir./subdir/how.php./cool.php

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

$ find .$ find . -print2. 查找分外的目录或路径

下面的命令会查找当前目录下 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.php10. 查找具有 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 5016. 查找过去的 N 天内被访问过的文件

# find / -atime -5017. 查找某段韶光范围内被修正过内容的文件

# find / -mtime +50 -mtime -10018. 查找过去的 N 分钟内状态发生改变的文件

$ find /home/bob -cmin -6019. 查找过去的 1 小时内被修正过内容的文件

# find / -mmin -6020. 查找过去的 1 小时内被访问过的文件

# find / -amin -60

五、基于文件大小的查找

21. 查找指定大小的文件

$ find / -size 50M22. 查找大小在一定范围内的文件

$ find / -size +50M -size -100M23. 查找最大和最小的文件

我们可以将 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 524. 查找空文件和空目录

查找空文件:

# 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.txtdrwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:48 ./abcdrwxrwxr-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.php26. 删除找到的文件

下面的命令会删除 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 {} \;

原文地址:http://www.codebelief.com/