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/