shell find 命令不递归查询

linux 中在使用 find 命令和其他命令不一样,别个命令都是需要加 -r-R 才能递归查找,而 find 则默认递归。虽然很少会用到 find 去查当前目录的东西,但凡事都有特殊不是,比如想要快速列出某个目录下的指定文件并只显示文件名,用 find 明显比 ls 好用得多,而且在文件不存在的情况下,可以返回 0 ,相比 ls 文件不存在返回 2 或 ls+grep 文件不存在返回 1 更适合用于脚本编写。好吧,扯远了,下面就来说说如何让 find 只查找指定目录而不递归。

  • 从网上资料来看,比较热门的三种答案分别是:
1
2
3
find . -xdev -name "*.zip" -exec basename {} \;
find . ! -name "." -type d -prune -o -type f -name "*.zip" -exec basename {} \;
find . -maxdepth 1 -name "*.zip" -exec basename {} \;

下面我们来逐一分析:

第一种:(不可行)

find . -xdev -name "*.zip" -exec basename {} \;

当看到问题,很多人都不假思索地说加 -xdev 参数即可,我怀疑他们是不是真的试过,亦或是断章取义。

-xdev 参数在 man 里的解释为:

-xdev Don’t descend directories on other filesystems.

咋一看,很像 不要检查目录 ,但是看到后面才能理解,是 不要检查其他文件系统/分区上的目录
也就是说,只要文件夹在同一个分区,还是会递归查询的。

第二种:(可行)

find . ! -name "." -type d -prune -o -type f -name "*.zip" -exec basename {} \;

按我的理解就是,先把非当前目录的目录屏蔽掉,然后再进行查找,曲线救国中的一种吧,不过确实可行。

第三种:(可行)

find . -maxdepth 1 -name "*.zip" -exec basename {} \;

-maxdepth 参数在 man 里的解释为:

1
2
3
-maxdepth levels
Descend at most levels (a non-negative integer) levels of directories below the command line arguments. -maxdepth 0
means only apply the tests and actions to the command line arguments.

这是一个控制 find 查找最大递归的参数,设置成 1 就是只查找当前层,算是只查找当前目录的一个官方参数吧。

总结以上,使用 -maxdepth 参数才是最靠谱的 find 只查找当前目录的方式。

That’s all.