如何通过bash查找含指定文件的目录并在对应目录执行命令
解决方案
方法1:使用-execdir(推荐,GNU find 适用)
该参数是GNU find专门为这类场景设计的,会自动切换到匹配文件所在的目录后再执行指定命令,写法最简单:
find . -name "thisfile" -execdir ls \;
- 如果你要执行其他命令,直接替换
ls为你需要的命令即可,比如要统计目录下文件数量就改成ls -l | wc -l - 结尾的
\;是find命令-exec/-execdir参数的固定结束标记,不能省略
方法2:POSIX 兼容写法(适配所有类Unix系统)
如果你的系统没有GNU find(比如部分BSD系统、旧版Unix),可以通过调用子shell处理路径切换:
find . -name "thisfile" -exec sh -c 'cd "$(dirname "$1")" && ls' _ {} \;
- 这里的
{}是find的占位符,会被替换为找到的thisfile的完整路径 - 子shell脚本里的
$1对应传入的文件路径,dirname "$1"提取出文件所在的目录 - 开头的
_是用来填充子shell的$0位,属于可省略但更规范的写法
常见错误说明
你之前尝试的写法不生效主要是两个原因:
- 直接在
-exec参数里写&&连接命令会被当前shell截断,不会作为find要执行的命令的一部分 - 普通的
-exec是在你执行find命令的当前目录运行命令,不会自动切换到匹配文件所在目录,单独执行cd也只会对该次执行的子进程生效,不会影响后续命令执行
内容的提问来源于stack exchange,提问作者Zener
相关产品推荐
相关产品推荐

