Linux find
Linux find命令是从命令行搜索文件非常有用和方便的命令。它可以用来查找基于各种搜索标准,如权限,用户所有权,修改日期/时间,大小等文件。在这篇文章中,我们将学习使用find命令以及它支持的各种选项。
find命令在大多数Linux发行版上默认都是可用的,所以你不必安装任何软件包。
find命令的基本语法如下所示
$ find location comparison-criteria search-term
基本的例子
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”)时,可以忽略尾部的斜杠。但是,如果目录实际上是其他位置的符号链接,则必须指定尾部的斜线以使其正常工作(找到./test/ ...)
注意:
搜索文件名时忽略大小写通常是有用的。如要要忽略这种情况,只需使用“iname”选项而不是“name”选项即可。
$ find ./test -iname "*.Php"
./test/subdir/how.php
./test/cool.php
3.限制目录遍历的深度
默认情况下,find命令以递归方式遍历整个目录树,这是很耗费时间和资源的。但是可以指定目录层次的深度。例如,我们不希望在子目录中超过2或3个层次。这是使用maxdepth选项完成的。
$ find ./test -maxdepth 2 -name "*.php"
./test/subdir/how.php
./test/cool.php
$ find ./test -maxdepth 1 -name *.php
./test/cool.php
第二个示例使用1的maxdepth,这意味着它不会低于1级深度,只能在当前目录中。
当我们只想在当前目录或最大1级深度的子目录中进行有限的搜索时,这是非常有用的,而不是整个目录树会花费更多的时间。
就像maxdepth一样,有一个名为mindepth的选项,它的名字就是这么做的,也就是说,在搜索文件之前,它会进入至少N级的深度。
4.反转匹配
也可以搜索与给定名称或模式不匹配的文件。当我们知道从搜索中排除哪些文件时,这很有帮助。
$ find ./test -not -name "*.php"
./test
./test/abc.txt
./test/subdir
所以在上面的例子中我们发现了所有没有php扩展名的文件,要么是非php文件。find命令还支持非感叹号。
find ./test ! -name "*.php"
5.结合多个搜索标准
指定名称和反转时可以使用多个标准。例如
$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
上面的find命令查找以abc开头的文件,没有php扩展名。这是使用find命令可以构建强大的搜索表达式的一个例子。
OR运算符
当使用多个名称标准时,find命令会将它们与AND运算符相结合,这意味着只有满足所有标准的文件才会匹配。但是,如果我们需要执行一个基于OR的匹配,那么find命令具有“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/abc7.一起搜索多个目录
所以,让我们说你想要在两个单独的目录内搜索。
$ find ./test ./dir2 -type f -name "abc*"
./test/abc.txt
./dir2/abcdefg.txt
检查它是否列出了来自2个独立目录的文件。
8.找到隐藏的文件
Linux上的隐藏文件以一段时间开始。所以它很容易提及,在名称标准和列出所有隐藏的文件。
$ find ~ -type f -name ".*"
根据权限查找文件
9.查找具有特定权限的文件
find命令可以用于使用“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位的文件
find命令的“perm”选项接受与chmod相同的模式字符串。以下命令查找所有具有权限644和sgid位设置的文件。
# find / -perm 2644
同样使用1664粘性位。perm选项还支持使用替代语法而不是八进制数字。
$ 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.查找属于特定用户的文件
要查找所有者或根目录下根目录下名为tecmint.txt的单个文件。
$ find . -user bob
.
./abc.txt
./abc
./subdir
./subdir/how.php
./abc.php
我们也可以指定文件的名称或任何与名称相关的标准以及用户标准
$ find . -user bob -name '*.php'
很容易看到,我们如何建立标准,以缩小搜索匹配文件的标准。
14.搜索属于组的文件
查找属于特定组的所有文件。
# find /var/www -group developer
你知道你可以使用~符号搜索你的主目录吗?
$ find ~ -name "hidden.php"
根据修改日期和时间搜索文件和目录
find命令支持的另一个很好的搜索条件是修改和访问日期/时间。当我们想找出哪些文件被修改为特定时间或日期范围时,这非常方便。让我们举几个例子。
15.查找N天前修改的文件
查找所有在50天前修改过的文件。
# find / -mtime 50
16.查找最近N天访问的文件
查找过去50天内访问的所有文件。
# find / -atime 50
17.查找在几天内修改的文件
查找50到100天之前修改的所有文件。
# find / -mtime +50 –mtime -100
18.查找最近N分钟内更改的文件。
查找在最近1小时内修改的文件。
$ find /home/bob -cmin -60
19.上个小时修改的文件
查找最近1小时内修改的所有文件。
# find / -mmin -60
20.在最近1小时内查找访问的文件
查找最近1小时内访问的所有文件。
# find / -amin -60
根据大小搜索文件和目录
21.查找给定大小的文件
要找到所有50MB文件,请使用。
# find / -size 50M
22.查找大小范围内的文件
查找所有大于50MB且小于100MB的文件。
$ find / -size +50M -size -100M
23.找到最大和最小的文件
与ls和sort命令结合使用时,find命令可用于列出最大的文件。
以下命令将显示当前目录及其子目录中最大的5个文件。这可能需要一段时间才能执行,具体取决于命令必须处理的文件总数。
$ find . -type f -exec ls -s {} \; sort -n -r head -5
同样按照升序排序时,会先显示最小的文件
$ find . -type f -exec ls -s {} \; sort -n head -5
24.找到空文件和目录
以下命令使用find命令的“空白”选项,查找所有空的文件。
# find /tmp -type f -empty
要输入所有空目录,请使用类型“d”。
$ find ~/ -type d -empty
一些高级操作
find命令不仅可以根据某个标准查找文件,还可以使用任何linux命令对这些文件执行操作。例如,我们可能要删除一些文件。
这里有一些简单的例子
25.列出找到的文件
比方说我们使用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目录中的所有文本文件。
$ find /tmp -type f -name "*.txt" -exec rm -f {} \;
相同的操作可以用目录来执行,只需要输入类型d,而不是类型f。
让我们拿另一个例子,我们想删除大于100MB的文件
$ find /home/bob/dir -type f -name *.log -size +10M -exec rm -f {} \;
领取专属 10元无门槛券
私享最新 技术干货