40个Linux中find命令的最佳示例
Linux的find
命令是一个功能强大的工具,可以根据各种搜索条件定位和管理文件和目录。它可以通过名称、类型、扩展名、大小、权限等来查找目录和文件。
除了定位文件和目录,结合其他命令使用find
命令还可以对结果进行操作。添加-exec
选项可以让系统管理员运行外部命令,并根据指定的条件(如大小、名称等)对符合条件的文件进行复制、移动、删除或更改权限等操作。
本文将首先介绍基本的Linux find命令及其示例。这将展示给您和目录。然后,我们将向您展示如何使用-exec
选项来根据文件或目录的大小、权限等进行操作。
find命令的通用语法如下:
find {路径} {要搜索的文件或目录名称} {要执行的操作}
其中,
路径
指定目录。要搜索的文件或目录名称
:要查找的文件或目录的名称。要执行的操作
:例如复制、删除、移动等。
本教程将解释如何查找与指定模式匹配的文件和目录。我们还将看到如何对find命令定位的文件或目录执行操作。该指南以Ubuntu为基础,但适用于大多数Linux发行版和版本。
查找文件和目录
按名称或扩展名查找特定文件
要查找特定文件,请从根目录(/)运行以下命令。命令包含您要搜索的文件的确切名称。
find . -name file22.txt
输出
./test/file22.txt
./sales/file22.txt
请注意,结果包括路径。如果您不知道文件所在的目录,或者当该文件在多个位置时,这点很重要。
您还可以在当前位置的情况下在另一个目录中搜索文件。在这种情况下,您需要提供要搜索的目录的路径。
find ./test -name file22.txt
在另一个目录中查找特定文件
在我们的情况下,我们将在test目录中查找以文件开头的所有文件。
find ./test -name file*
输出
./test/file22.txt
./test/file30.doc
./test/file1.txt
./test/file5,doc
按扩展名查找文件
要在Linux中查找具有特定扩展名的文件,请将其添加到命令中。
find . -name *.txt
输出
./test/subtest/subfil.txt
./test/file22.txt
./test/file1.txt
./home1/files32.txt
./home2/file22.txt
./qa/tags.txt
按名称查找文件和目录
使用以下命令查找以qa
开头的文件和目录。在我们的计算机上,我们有qatree.txt
和qa.txt
文件,以及一个名为qa
的目录。
如果我们运行以下命令;
find ./ -name "qa*"
它返回以下输出
./test/qatree.pdf
./test/qa.txt
./home/qa
该命令返回与搜索条件匹配的文件和目录。要仅查找文件或目录,您需要在命令中指定此选项。
仅查找文件或目录
要仅查找文件,使用type f
开关。
仅文件
find ./ -type f -name "qa*"
输出
./test/qatree.pdf
./test/qa.txt
仅目录
添加type d
选项以仅查找目录。
find ./ -type d -name "qa*"
输出
./home/qa
不区分大小写的查找命令
所有使用-name
开关进行搜索的结果都是区分大小写的,不会返回大写字母的结果。要获取所有情况,请使用-iname
选项。
find ./ -iname "qa*"
输出
./test/qatree.pdf
./test/qa.txt
./test/QAtest.txt
./home/qa
从多个目录中查找文件
要在不同的目录中查找文件,请在命令中添加它们的路径。在我们的例子中,我们将在test
和numeric
目录中查找。
find ./test ./numeric -name file22.txt -type f
输出
./test/file22.txt
/root/numeric/file22.txt
从所有目录中查找具有不同扩展名的多个文件
您可以使用find命令查找具有不同扩展名(例如*.doc
,*.txt
,*.pdf
等)的多个文件。可以分别执行此操作,一次处理一个扩展名,或者使用一个命令包含所有所需的扩展名。
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
输出
./test/subtest/subfil.txt
./test/qatree.pdf
./test/file22.txt
./test/qa.txt
./test/file30.doc
./books/acro.pdf
./data1/FILE22.txt
./docs/files32.txt
查找包含特定文本的文件
有时,您想要访问包含特定文本的文件,但无法记住其文件名或位置。此命令允许您查找包含目标文本的所有文件。
要查找包含单词hyperconvergence
的所有文件,请使用:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
输出
/root/numeric/hci
/root/HCIP
选项-i
使命令忽略大小写,并且无论是大写还是小写都能找到文本,例如hyperconvergence
,Hyperconvergence
等。
要查找特定目录中的文件,只需将它们添加到命令中
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
输出
./numeric/hci
了解更多信息,请查看grep command examples。
根据大小查找文件和目录
您可以查找所有比某个特定大小更小、相等或更大的文件或目录,或在某个范围内或为空的文件或目录。根据您要搜索的文件或目录的类型,使用适当的大小格式。
大小选项包括:
c
– 字节
k
– 千字节
M
– 兆字节
G
– 千兆字节
查找特定大小的文件 – 等于30MB
要查找所有30MB的文件
find / -size 30M
查找大于指定大小的文件
find -size +2M
输出
. /Downloads/ubuntu18043.iso
./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
在当前目录中查找小于10MB的文件
find . -type f -size -10M
查找大小在100-200MB之间的文件
要查找在100MB和200MB之间的文件
find / -size +100M -size -200M
查找大于20kb的目录
find / -type d -size +20k
查找空文件和目录。
文件
find ./ -type f -size 0
或
find ./ -type f –empty
目录
find ./ -type d –empty
按年龄或修改时间查找文件
查找比n天更旧的文件
find /path/ -type f -name '*.txt' -mtime +8
-mtime +8
会查找8天前的txt
文件。
按修改日期
这将查找在最近17小时内修改的文件。
find . -mtime -17 -type f
查找在最近10天内修改的目录。
find . -mtime -10 -type d
按访问或修改查找文件
根据日期或时间访问文件。这允许您查看在指定时间内是否访问过文件。
查看在家目录中在最近10天内未被访问过的文件。
find /home -atime +10
刚好在10天前访问的文件。
find /home -atime 10
在最近10天内访问的文件。
find /home -atime -10
查找在最近n天内修改的文件
您还可以使用以下命令查找在最近10天内修改的文件:
find /home -mtime -10
查找在特定时间段内修改的文件
例如,在家目录中查找在6至15天前修改的所有文件。
find /home -type f -mtime +6 -mtime -15
在最近10分钟内访问的文件和目录
要查找在最近10分钟内访问的文件,请使用-amin选项。
find . -amin -10 -type f
输出
./.bash_history
./.profileroot@ubuntu1804:~#
在最近10分钟内访问的目录
find . -amin -10 -type d
查找符合特定权限的文件
语法
$ find -perm mode
其中mode是权限,可以是数字(如644、655、700、777
等)或字母(如u=x、a=r+x
等)。
您可以使用以下三种不同的方式指定权限。
- 没有前缀时,表示要查找具有指定权限的文件。
- 使用“
-
”表示至少具有指定权限的文件。这将返回具有指定权限以及其他更高权限的文件。 - 使用“
/
”需要指定拥有者或组以及权限的文件。
查找具有权限777的文件
find -perm 777
输出
./file1
查找至少具有766
权限的文件
find -perm -766
输出
./file2
./file1
该命令查找所有文件中
- 文件所有者具有读/写/执行权限。
- 组具有读/写权限。
- 其他人具有读/写权限。
因此,它返回两个符合此条件的文件:file1和file2。文件不需要具有确切的766
权限,但必须至少具有指定的权限。
查找由所有者可写的文件
我们现在将使用“/
”来查找由其所有者、组或其他人可写的文件。
find -perm /222
.
./file2
./file3
./file1
以上命令查找由其所有者或组可写的文件。
这将返回由其中一个可写,但不一定是两者都可写的文件。要查看两者都具有可写权限的文件,请使用“-”前缀。
find -perm -220
输出
./file2
./file1
查找由用户拥有的文件
查找所有由Jack拥有的文件
find /home -user jack
输出
/home/jack
/home/jack/examples.desktop
/home/jack/.gnupg
/home/jack/.gnupg/private-keys-v1.d
/home/jack/ans.cgi
查找由用户拥有的特定文件
查找所有由Jack拥有的文本文件
find /home -user jack -iname "*.txt"
输出
/home/jack/docs/file32.txt
查找并列出文件和目录以及它们的权限
find -name "*.conf" | ls -l
输出
总共 120
drwxr-xr-x 2 root root 4096 12月 31 13:19 backup2
drwxr-xr-x 2 root root 4096 1月 4 11:57 Desktop
drwxr-xr-x 2 root root 4096 12月 31 11:50 Documents
drwxr-xr-x 2 root root 4096 12月 31 12:27 Downloads
-rw-r--r-- 1 root root 0 1月 4 12:02 file22.doc
drwxr-xr-x 2 root root 4096 1月 4 12:14 file23
-rw-r--r-- 1 root root 0 1月 4 12:23 file23.txt
查找并对结果进行操作
在本节中,我们将看看如何对与find命令中指定的模式匹配的文件进行操作。
查找文件并更改权限
查找并更改特定文件类型的权限。在我们的案例中,我们将使用具有不同权限的PHP文件进行操作,如下所示。
jack@ubuntu1804:~/ver$ ls -la
总共 8
drwxrwxr-x 2 jack jack 4096 1月 3 14:11 .
drwxr-xr-x 8 jack jack 4096 1月 3 14:05 ..
-rwxr-xr-x 1 jack jack 0 1月 3 14:06 ans.php
-rw-rw-r-- 1 jack jack 0 1月 3 14:11 base.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:06 query.php
-rw-rw-r-- 1 jack jack 0 1月 3 14:11 qust.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:06 text.php
-rw-rw-r-- 1 jack jack 0 1月 3 14:11 vary.php
我们现在将查找所有PHP文件(如上所示),并将其权限替换为755
find ver -name "*.php" -type f -exec chmod 755 {} ;
该命令在ver
目录中查找PHP文件,然后将它们的权限设置为755
(rwxr-xr-x
)
结果
jack@ubuntu1804:~/ver$ ls -la
总共 8
drwxrwxr-x 2 jack jack 4096 1月 3 14:11 .
drwxr-xr-x 8 jack jack 4096 1月 3 14:05 ..
-rwxr-xr-x 1 jack jack 0 1月 3 14:06 ans.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:11 base.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:06 query.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:11 qust.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:06 text.php
-rwxr-xr-x 1 jack jack 0 1月 3 14:11 vary.php
查找并更改文件和目录权限
查找具有644权限的文件并将其更改为655权限
find . -type f -perm 644 -exec chmod 655 {} ;
您还可以查找具有644权限的目录并将其替换为755。
find . -type d -perm 644
输出
./docs
docs文件夹具有644权限
drwxrwxr-x 2 jack jack 4096 1月 3 12:45 docs
要将其设置为755
,我们运行
find . -type d -perm 644 -exec chmod 755 {} ;
现在我们可以再次检查以查看哪些具有755
find . -type d -perm 755
输出
.
./docs
从上面我们可以看到根目录和docs目录具有755权限。
Ls –la
命令给出以下详细信息
drwxr-xr-x 2 jack jack 4096 1月 3 12:45 docs
查找并复制文件或目录
查找并将特定文件复制到目录
以下命令将找到file22.tx
t文件并将其复制到~/tmp/images
目录。
find -iname file22.txt -exec cp {} ~/tmp/images ;
查找并将一种类型的文件复制到目录
要在当前目录中查找具有jpg
扩展名的文件(如图像)并将它们复制到不同位置(如图像文件夹),请使用:
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
这将查找并将所有jpg文件复制到~/tmp/images
文件夹。
查找并将一个文件复制到多个目录
查找并将一个文件复制到多个目录。
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
这将找到文件 hci 并将其复制到 /tmp/dir1/ /tmp/dir2/
和 $HOME/3/
这三个目录中。
查找并移动文件到不同的目录
移动已知目录中的文件到另一个目录。移动 universal.php
文件;
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
查找并移动具有特定扩展名的文件到不同的文件夹
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
查找特定文件并移动到特定文件夹
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
该命令寻找所有以 uni
开头且有任何扩展名的文件。然后将它们移动到目录 /unifiles/
根据文件的年龄查找并移动文件
查找并将文件移动到指定天数之前的位置,例如归档。
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
这将查找早于20天的pdf文件并将其移动到backup1目录。
查找并删除文件和目录
在当前目录中查找并删除文件或目录的语法为
find . -type f -name "要删除的文件" -exec rm -f {} ;
只删除文件 或者
find . -type d -name "要删除的目录" -exec rm -rf {} ;
只删除目录
仅查找并删除特定文件
要查找并删除以 til 开头的文件,使用以下命令;
find . -type f -name "til*" -exec rm {} ;
要查找并删除以 til 开头的目录
find . -type d -name "til*" -exec rm {} ;
删除文件和目录
find . -name "til*" -exec rm -rf {} ;
这将删除以 til 开头的文件和目录。
按扩展名删除
以下是如何在当前目录中查找并删除所有 txt
文件的方法。将 txt
替换为其他扩展名,如 bak
、pdf
或任何您想要删除的扩展名。
find . -type f -name "*.txt" -exec rm -f {} ;
如果你希望系统在删除每个文件之前提示你确认,添加 -i 选项如下。
find . -type f -name "*.txt" -exec rm -i {} ;
输出
rm: remove regular empty file './File22.txt'? y
rm: remove regular empty file './file22.txt'? y
rm: remove regular empty file './file23.txt'?
默认情况下,-rm 不会删除目录,你需要使用 -r 选项来确保递归删除。这将确保删除空目录和包含文件的目录。-f 选项强制删除,对于文件和目录都适用。
查找并删除 n 天之前的文件
在当前目录中查找并删除早于 20 天的备份文件。
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
这将删除所有早于 20 天的文件。
仅查找并删除目录
要删除名为 dir22
的目录
find . -type d -name dir22 -exec rm -rf {} ;
确保匹配目录名称的大小写,或使用 -iname 选项。
find . -type d -iname Dir22 -exec rm -rf {} ;
将同时删除 Dir22
和 dir22
在删除之前进行确认,请使用 -i 选项。
find . -type d -iname Dir22 -exec rm -rf -i {} ;
输出
rm: remove directory ‘./Dir22’? n
rm: remove directory ‘./dir22’? y
在我们的情况下,我们输入了n
以保留目录Dir22
,该目录不会被删除,并且输入了y
以删除dir22
目录。
查找并删除空文件
您可以使用以下任何一种命令来定位并自动删除空文件。
find ./ -type f -size 0 -exec rm -f {} ;
或者
find ./ -type f -size 0 | xargs rm -f
或者
find ./ -type f -size 0 –delete
查找并删除空目录
为了删除空目录,我们将使用d
选项。
find ./ -type d -empty -exec rmdir {} ;
另一种选择是使用delete而不是remove。
find ./ -type d -empty -delete
请注意,从计算机中删除系统或关键文件可能会损坏操作系统或应用程序,或导致重要数据丢失。
为了避免意外删除,最好使用非root用户帐户。同时,请确保您删除的是无用的正确文件,并备份所有数据文件以防万一。
接下来是什么?
请在您的实验室或非生产环境中尝试上述Linux find命令。看看您是否可以使用其中一些命令来自动清理文件系统,使用Crontab。要掌握Linux,请查看此online course。