Linux `find` 命令详解:文件搜索与管理利器
Linux `find` 命令是一款强大的工具,它让系统管理员能够根据多样的搜索条件精准定位和管理文件及目录。借助此命令,可以按照名称、类型、扩展名、大小、权限等属性,高效地查找目标文件或目录。
除了基本的文件和目录定位功能,`find` 命令与其他命令结合使用,还能实现对搜索结果的进一步操作。通过添加 `-exec` 选项,系统管理员可以执行外部命令,完成诸如复制、移动、删除,或是更改符合特定条件(例如大小、名称等)的文件权限等任务。
本文将首先通过实例介绍 `find` 命令的基本用法,演示如何查找文件和目录。随后,将深入讲解如何结合 `-exec` 选项,对符合特定条件的文件或目录执行操作,如根据文件或目录的大小、权限等进行管理。
`find` 命令的通用语法结构如下:
find {路径} {要搜索的文件或目录名称} {要执行的操作}
其中:
- `路径`:指定搜索的起始目录。
- `要搜索的文件或目录名称`:指明要查找的文件或目录的具体名称。
- `要执行的操作`:例如复制、删除、移动等。
本教程将重点介绍如何定位与特定模式匹配的文件和目录,并展示如何对 `find` 命令搜索到的文件或目录执行操作。本指南基于 Ubuntu 系统,但其原理和用法适用于大多数 Linux 发行版和版本。
文件和目录查找
按名称或扩展名查找特定文件
若要查找特定文件,请从根目录(`/`)执行以下命令。此命令需要包含您要搜索的文件的确切名称。
find . -name file22.txt
输出结果:
./test/file22.txt ./sales/file22.txt
请注意,返回的结果包含了文件路径。如果您不清楚文件所在的目录,或者文件存在于多个位置时,这一点尤其重要。
您也可以在当前位置的基础上,指定其他目录进行文件搜索。此时,您需要提供要搜索的目录的路径。
find ./test -name file22.txt
在特定目录下查找文件
以示例来说,我们将在 `test` 目录下查找所有以字母“file”开头的文件。
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` 等。可以单独执行多次搜索,每次查找一种扩展名的文件,也可以使用一个包含所有扩展名的命令。
以下命令查找所有 `.txt`, `.pdf`, 和 `.doc` 文件:
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` 命令示例,请自行查阅。
根据大小查找文件和目录
您可以查找所有小于、等于或大于特定大小,或在一定大小范围内的,或为空的文件或目录。根据您要搜索的文件或目录类型,使用合适的大小单位。
大小单位包括:
`c` – 字节
`k` – 千字节
`M` – 兆字节
`G` – 千兆字节
查找特定大小的文件 – 等于 30MB
查找所有大小为 30MB 的文件:
find / -size 30M
查找大于指定大小的文件
find / -size +2M
输出结果:
./Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f4143050577a9c
在当前目录中查找小于 10MB 的文件
find . -type f -size -10M
查找大小在 100-200MB 之间的文件
查找特定大小范围内的文件,例如 100 到 200 MB 之间:
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 天内修改过的文件
以下命令可以查找`/home`目录下最近 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 ./[email protected]:~#
最近 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
输出结果:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
查找结果并根据结果采取行动
本节我们将学习如何对与 `find` 命令中指定模式匹配的文件执行操作。
查找文件并更改权限
查找并更改特定类型文件的权限。例如,我们将使用具有不同权限的 PHP 文件:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
我们将查找所有 PHP 文件(如上图所示),并将其权限更改为 `755`:
find ver -name "*.php" -type f -exec chmod 755 {} \;
该命令在 `ver` 目录中查找 PHP 文件,然后将其权限设置为 `755` (`rwxr-xr-x`)。
执行结果:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 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 Jan 3 12:45 docs
要将其设置为 `755`,我们运行:
find . -type d -perm 644 -exec chmod 755 {} \;
现在我们可以再次检查,查看 `755` 到底是什么:
find . -type d -perm 755
输出结果:
.
./docs
从上面我们可以看到 `root` 和 `docs` 目录的权限为 `755`。
`ls -la` 命令提供以下详细信息:
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
查找并复制文件或目录
查找特定文件并将其复制到目录。
以下命令会查找 `file22.txt` 文件并将其复制到 `~/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 天的 `.bak` 文件。
仅查找和删除目录
删除名为 `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
在我们的示例中,对于不会被删除的目录 `Dir22`,我们输入 `n`,对于现在将被删除的 `dir22`,我们输入 `y`。
查找并删除空文件
您可以使用以下任何命令来定位空文件并自动删除它们:
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` 而不是 `rmdir`:
find ./ -type d -empty --delete
请注意,从您的计算机中删除系统文件或重要文件可能会损坏操作系统或应用程序,或导致您的重要数据丢失。
为了避免意外删除,最好使用非 `root` 用户帐户。此外,请确保您删除的是无用的正确文件,并且您有所有数据文件的备份,以防万一。
下一步是什么?
请在您的实验室或非生产环境中尝试上述 Linux `find` 命令。看看是否可以使用一些命令,并利用 Crontab 来自动清理文件系统。而且,若想精通 Linux,不妨考虑此在线课程.