Linux find 命令:如何查找文件和目录

Linux 中的 find 命令会浏览指定目录及其子项,以查找符合名称、类型或大小等条件的文件或目录。请同时指定搜索位置和条件,并将文件名模式用引号括起来,以防止 shell 预先展开它们。

基本格式和搜索范围

在以下格式中,起始路径是搜索开始的地方,条件限制要找到的内容。路径本身也包含在搜索目标中。下面的示例基于 GNU findutils find 和 Bash。

find PATH EXPRESSION

find . 会遍历当前目录及其子目录,而 find /etc 从 /etc 开始。如果未指定条件,它会打印路径并且还会搜索隐藏文件和隐藏目录。没有权限的目录可能会显示访问错误,并且其内容不会被搜索。

下一个练习是在新的临时目录中创建文件。你需要在同一个终端中继续操作以保留 workdir 变量。在打印路径以检查位置后,运行示例。

workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"

按名称和文件类型查找

-name 对最终路径组件进行区分大小写的匹配,而不是整个路径。-iname 不区分大小写。单引号可防止 shell 先展开 *,使模式原样传递给 find。

find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'

第一个命令搜索 app.conf 和 .hidden.conf,第二个命令还会找到 EXTRA.CONF。输出顺序可能因环境而异。输入 find /etc *.conf 没有名称条件,并且可能根据 shell 展开而产生意外行为,因此应避免使用。相反,请使用 find /etc -name '*.conf'。

-type f 搜索普通文件,-type d 搜索目录。如果条件组合,必须全部满足。

find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'

第一个命令只输出具有匹配扩展名的常规文件,第二个命令只输出名为 docs 的目录。默认情况下,GNU find 不会跟随指向子目录的符号链接。要查找符号链接本身,请使用 -type l。

按深度和空项缩小范围

-maxdepth 1 仅搜索起始路径及其直接下方的项目。要从结果中排除起始路径,也请指定 -mindepth 1。建议在 GNU find 中将两个选项放在条件之前。

find "$workdir" -mindepth 1 -maxdepth 1 -type d

在实践中,docs 和 empty-dir 会在下方立即显示。-empty 查找空的常规文件和空目录,因此可以通过指定所需类型来区分。

find "$workdir" -type f -empty
find "$workdir" -type d -empty

在实践中使用 touch 创建的文件都是空的。在第二个命令中,出现了 empty-dir。不要直接将搜索结果视为删除目标;首先检查路径和条件。

对找到的文件执行命令

-exec 对匹配的项目执行命令。以下示例输出普通文件的字节数而不删除它们。{} 会被替换为找到的路径,+ 尽可能将多个路径分组以传递给命令。

find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +

由于练习文件是空的,每个文件的字节数显示为0。wc也可以在接收多个文件时显示总数。即使文件名中有空格,每个路径也作为单独的参数传递。要对每个项目单独执行命令,可以使用\;而不是+。

在合并删除或修改命令之前,首先只输出在相同条件下的路径,并检查目标和备份。在搜索过程中其他用户可能更改文件的目录中,即使检查过后目标也可能变化,因此需要额外小心。有关更多详细信息,请参阅GNU find 安全注意事项。

当结果与预期不同

如果没有结果,请依次检查起始路径、名称中字母的大小写、扩展名以及文件类型。同时,检查模式是否被引号括住,以及是否需要完整路径而不是-name。在基于完整路径进行搜索时,可以使用-path。

如果出现权限错误,意味着有无法搜索的区域。请检查必要的访问权限,并在使用管理员权限时,仔细限制搜索范围和要执行的操作。名称模式和选项的详细含义可以在GNU查找名称模式说明中找到。