如何使用Linux的find命令查找不包含特定类型文件的目录?
如何使用Linux的find命令查找不包含特定类型文件的目录?
嘿,刚接触Linux的小伙伴,这个需求完全可以用find命令实现,我给你两种实用的方法,都是日常工作里常用的:
方法一:直接用find结合-exec做检查
这个思路很直接:先定位所有目录,然后逐个检查该目录下有没有.jpg文件,如果没有就把目录路径打印出来。
命令如下:
find /你要搜索的路径 -type d -exec sh -c '! ls {}/*.jpg 2>/dev/null' \; -print
我给你拆解下每个部分:
-type d:只筛选目录,排除普通文件、链接等其他类型-exec sh -c '! ls {}/*.jpg 2>/dev/null' \;:对每个找到的目录执行shell命令,! ls {}/*.jpg表示如果ls找不到该目录下的.jpg文件(命令执行失败),就符合我们的条件;2>/dev/null是把ls找不到文件时的错误提示丢弃,避免干扰输出-print:当前面的条件满足时,输出该目录的路径
方法二:先找包含目标文件的目录,再取反
如果觉得第一种方法有点绕,也可以换个思路:先找出所有包含.jpg文件的目录,然后在所有目录里排除这些目录,剩下的就是你要找的内容。
命令可以这么写:
find /你要搜索的路径 -type d -not -path "$(find /你要搜索的路径 -name "*.jpg" -printf "%h\n" | sort -u)"
拆解一下关键部分:
- 内层命令
find /你要搜索的路径 -name "*.jpg" -printf "%h\n" | sort -u:找出所有.jpg文件所在的目录,%h用于提取文件的目录部分,sort -u是为了去重,避免重复的目录被多次列出 - 外层
find用-not -path排除掉这些包含.jpg的目录,剩下的就是不包含.jpg文件的目录
小提示
- 如果要搜索当前目录,直接把
/你要搜索的路径换成.即可 - 这两种方法都会自动递归搜索所有子目录,不需要额外添加参数
- 要是你想查找不包含其他类型文件的目录,比如
.png,只需要把命令里的*.jpg替换成*.png就可以啦
备注:内容来源于stack exchange,提问作者Daydreamer067
相关产品推荐
相关产品推荐

