在 find 命令中,用 ! 配合 -name 或 -iname 可查找不以特定后缀结尾的文件,需将 ! 置于测试条件前并注意转义与括号;结合 -type f 可限定只查普通文件,-iname 支持忽略大小写匹配。

在 find 命令中,用 !(逻辑非)配合 -name 或 -iname 可以查找**不以特定后缀结尾**的文件。关键是要把 ! 放在对应测试条件的前面,并注意括号和转义问题。
基本语法:用 ! 否定 -name
! 是 find 的逻辑非操作符,必须写在被否定的测试条件之前。例如,排除所有 .log 文件:
find . ! -name "*.log"
这会列出当前目录及子目录中所有**名字不匹配 *.log** 的条目(包括文件和目录)。注意:! 和 -name 之间要有空格,且 ! 不能被 shell 当作历史展开符号处理——在大多数 shell 中直接写 ! 即可;若报错,可改用 \! 或 '!'。
只查文件(排除目录),避免误匹配
上面命令会同时匹配非 .log 的目录和文件。如只想找**普通文件**且不以某后缀结尾,需加上 -type f:
-
find . -type f ! -name "*.tmp"→ 所有非.tmp的普通文件 -
find /path -type f ! \( -name "*.bak" -o -name "*.swp" \)→ 排除多个后缀(注意括号需转义或加引号)
忽略大小写:用 -iname 配合 !
如果想匹配 .LOG、.Log 等变体,用 -iname 更稳妥:
find . -type f ! -iname "*.jpg"
这样能排除所有大小写组合的 JPG 类型文件,比如 photo.JPG、IMG.jPg 都不会出现。
常见陷阱与建议
- 不要写成
find . -name "!*.log"—— 这是把!当作文件名一部分,不是逻辑非 - 多个条件组合时,优先级靠括号控制:
! \( -name "*.conf" -o -name "*.cfg" \) - 路径中含空格或特殊字符时,建议对整个 find 命令加单引号,或确保 shell 不提前解析
- 如只需当前层,加
-maxdepth 1;如要排除隐藏文件,可额外加-not -name ".*"











