HJM

导航

Linux find命令

Linux find命令

Linux find命令是命令行上非常有用和方便的搜索文件的命令。它可用于根据各种搜索标准查找文件,如权限,用户所有权,修改时间/日期,大小等。在这篇文章中,我们将学习使用find命令以及它支持的各种选项。

大多数Linux发行版find命令默认是可用的,因此你不必安装任何软件包。在Linux上,如果你想高效的使用Linux命令行,find命令是必须学习的。

基本的find命令语法如下

$ find location comparison-criteria search-term

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

这条命令列出当前目录中的所有文件以及当前目录中的子目录。

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

这条命令与以下命令等价

# find .
# find . -print

2. 搜索指定目录或路径

以下命令将查找当前目录中test目录下的文件,默认情况下将列出所有文件。

# find ./test
./test
./test/abc.txt
./test/cool.php
./test/subdir
./test/subdir/how.php

以下命令通过文件名搜索文件

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

我们也可以使用通配符

# find ./test -name "*.php"
./test/cool.php
./test/subdir/how.php

请注意,所以有的子目录都是被递归搜索的。因此,这是查找给定扩展名所有文件的一种非常强大的方法。

尝试搜索根目录"/",将会搜索整个文件系统包括挂载设备和网络存储设备。 所以要小心,当然你们可以随时通过Ctrl + c中止命令。

当指定目录时(本例中为"./test"),可以省略尾部的斜线,然而,如果目录是指向其他位置的链接时,为了使它工作正常,你必须指定尾部的斜线(find ./test/ ...)

忽略大小写

当搜索文件名时忽略大小写通常很有用。为了忽略大小写,只需使用"iname"选项替代"name"选项。

# find ./test -iname "*.Php"
./test/cool.php
./test/subdir/how.php

将搜索项(名称参数)添加单引号或双引号总是更好的做法。
不这样做看起来有时候会起作用,其他时候又会给出奇怪的结果。

3. 限制目录遍历的深度

默认情况下,find命令递归的遍历整个目录树。非常消耗时间和资源。然而,可以指定目录遍历的深度。例如,我们不想遍历2,3级子目录,这可以使用maxdepth选项完成。

]# find ./test -maxdepth 2 -name '*.php'
./test/cool.php
./test/subdir/how.php

# find ./test -maxdepth 1 -name '*.php' 
./test/cool.php

第二个示例使用maxdepth 1选项,它意味着不会搜索超过1级深度,仅在当前目录中。

当我们希望限制搜索仅在当前目录或最大1级深度子目录,这很有用,不必搜索整个目录,而这将需要大量时间 。

就像maxdepth一样,有一个名为mindepth的选项可以实现如其名称所暗示的功能,它将至少搜索n级深度。

4. 反转匹配

也可以搜索与指定名称或模式不匹配的文件,当我们知道要从搜索中排除哪些文件时,这很有用。

# find ./test -not -name '*.php'
./test
./test/abc.txt
./test/subdir

所以在上面的例子中我们发现所有没有php扩展名的文件,都是非php文件。find命令也支持用感叹号替代not

# find ./test ! -name '*.php'    
./test
./test/abc.txt
./test/subdir

5. 组合多个搜索条件

当指定名称或反转时可以使用多个条件。例如:

# find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt

上面的find命令查找文件名以abc开头同时扩展名不是php的文件。这是一个使用find命令构建强大的搜索表达式的示例

OR操作符

当使用多个名称条件时,find命令将用and操作符组合他们,这意味着只有当文件符合所有条件时才被匹配。然而,如果我们需要执行一个基于or的匹配,find也有'o'开关。

# find ./test -name '*.php' -o -name '*.txt'
./test/abc.txt
./test/cool.php
./test/subdir/how.php

上面的命令搜索以php或txt为扩展名结尾的文件

6. 仅搜索文件或目录

有时候,我们希望仅查找指定名称的文件或目录。find能够轻松的实现。

# find ./test -name 'abc*'
./test/abc.txt
./test/abc

Only files

# find ./test -type f -name 'abc*'
./test/abc.txt

Only directories
# find ./test -type d -name 'abc*' 
./test/abc

相当有用和方便

7. 一起搜索多个目录

因此,假如你希望在2个单独的目录中进行搜索,同样,命令非常简单

# find ./test ./dir2 -type f -name 'abc*'
./test/abc.txt
./dir2/abcdefg.txt

检查它是否列出了2个独立目录中的文件

8. 查找隐藏文件

Linux中隐藏文件以点号开头(.), 因此,它很容易在名称条件中指定和显示所有隐藏文件。

# find ~ -type f -name '.*'

9. 查找特定权限的文件

find命令可以使用"perm"来查找指定权限的文件。下列的命令查找权限为0644的文件。

# find . -type f -perm 0644
./abc.txt
./cool.php
./subdir/how.php
./abc.php

这对查找赋予了错误权限的文件很有用,这些文件可能导致安全问题。取反也可用于权限检查。

# find . -type f ! -perm 0777
./abc.txt
./cool.php
./subdir/how.php
./abc.php

10. 查找设置了sgid/suid位的文件

find命令的"perm"选项接收与chmod命令一样的字符模式。下列的命令查找所有权限为644以及设置了sgid位的文件。

# find / -perm 2644

类似地,使用1644查找权限为644并设置了粘滞位的文件,"perm"也支持使用替代语法而不是八进制数。

# find / -maxdepth 3 -perm /u=s 2>/dev/null 
/usr/bin/fusermount
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/staprun
/usr/bin/mount
/usr/bin/crontab
/usr/bin/su
/usr/bin/umount
/usr/bin/pkexec
/usr/bin/sudo
/usr/bin/passwd
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/usernetctl

注意,“2>/dev/null"删除了带有"权限错误”的条目。

11. 查找只读文件

查找所有只读文件

oot 66176 Aug  4  2017 /bin/ping
[root@lanquark test]# find /etc -maxdepth 1 -perm /u=r
/etc
/etc/fstab
/etc/crypttab
/etc/mtab
/etc/resolv.conf
...省略后续输出

12. 查找可执行文件

下面的命令将查找可执行文件

[root@lanquark test]# find /usr/bin -maxdepth 2 -perm /a=x
/usr/bin/cp
/usr/bin/lua
...省略后续输出

13. 查找特殊用户拥有的文件

在所有者为root的/root目录下,查找所有或单个名称为tecmint.txt的文件

# find . -user root
.
./abc.txt
./cool.php
./subdir
./subdir/how.php
./abc
./abc.php

我们也可以指定文件的名称或者任何与用户条件相关的名称条件。

# find . -user root -name '*.php'
./cool.php
./subdir/how.php
./abc.php

显而易见,我们可以如何构建条件以缩小我们匹配的搜索范围。、

14. 搜索属于组的文件

搜索属于某个特定组的所有文件

# find . -group hjm
./abc.txt

你知道你可以使用~符号搜索你的家目录吗?

# find ~ -name abc.txt
/root/abc.txt
/root/test/abc.txt

很简单

搜索文件和目录基于修改日期和时间

另一个find命令支持的重要搜索条件是修改和访问日期/时间。当我们想要找出特定时间和日期范围修改的文件时非常方便。让我们来看一些小例子。

16. 查找访问时间距当前日期N天的文件(时间点)

# find / -atime 50

17. 查找某个时间范围内修改的文件

查找修改时间在50以前,100天以内的所有文件

# find / -mtime +50 -mtime -100

18. 查找最近N分钟内属性更改的文件。

查找最近1小时内属性更改的文件。

# find . -cmin -60

19. 查找最近1小时内内容更改的文件。

查找最近1小时内文件内容更改的所有文件。

# find / -mmin -60 

20. 查找最近1小时内访问的文件

查找最近1小时内访问的所有文件。

# find / -amin -60

21. 查找指定大小的文件

基于大小查找文件和目录,查找甩的50M的文件,使用

# find / -size 50M

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

查找所有大于50M小于100M的文件

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

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

find命令结合ls和sort命令可以列出最大的文件。
下述命令将显示当前目录和它的子目录下最大的5个文件。这将需要一点时间,取决于命令处理的文件数量。

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

24. 查找空文件和目录

下列命令使用find命令的"空"选项查找所有空文件。

# find /etc -type f -empty

查找所有的空目录使用类型"d"

# find /etc -type d -empty

真的非常简单和容易

一些高级的操作

find命令不仅可以通过一些条件查找文件,它也可以使用任何linux命令对这些文件进行操作。例如,我们想删除一些文件。

下面是一些简单的例子。

25. 列出找到的文件

假设我们用find命令找到了文件,现要想要像ls命令那样列出它们,它很简单。

# find . -exec ls -ld {} \;
drwxr-xr-x. 4 root root 77 Nov 19 20:28 .
-rw-r--r--. 1 root hjm 0 Nov 10 22:55 ./abc.txt
-rw-r--r--. 1 root root 0 Nov 10 22:55 ./cool.php
drwxr-xr-x. 2 root root 21 Nov 19 20:30 ./subdir
-rw-r--r--. 1 root root 0 Nov 19 20:30 ./subdir/how.php
drwxr-xr-x. 2 root root 6 Nov 11 00:49 ./abc
-rw-r--r--. 1 root root 0 Nov 19 20:28 ./abc.php

26. 删除所有匹配的文件或目录

下面的命令将删除tmp目录下的所有txt文件。

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

同样的操作也可以在目录上执行,只需要用type d代替type f

让我们再看一个我们想要删除大于100M的文件的例子

# find /root -type f -name '*.log' -size +10M -exec rm -f {} \;

总结

这是一个关于linux find命令的快速教程。find命令是linux
终端下最基本的命令,它让搜索文件非常容易,它是系统管理所必须的。因此,学习它。如果有问题,可以在下面的评论区留言。

原文:https://www.binarytides.com/category/linux/linux-commands/

posted on 2018-11-19 22:21  kennminn  阅读(1213)  评论(0编辑  收藏  举报