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查找名称模式说明中找到。




