如何用Bash单行命令结合find切换至匹配文件所在目录并执行命令
可行实现方案
下面提供2种兼容特殊文件名(含空格、换行等)的稳定实现:
- 方案1:直接用
find自带的-exec参数实现,逻辑最简单,适合文件量不大的场景
find . -name "*.txt" -exec sh -c 'cd "$(dirname "{}")" && acmd "$(basename "{}")"' \;
逻辑说明:为每个匹配到的txt文件启动子shell,先通过dirname提取文件所在目录并切换,切换成功后再用basename提取纯文件名传给acmd执行,&&可以避免目录切换失败时在错误路径执行命令。
如果你的acmd不需要传入文件名,只需要在对应目录下运行,删除末尾的"$(basename "{}")"即可。
- 方案2:搭配
xargs实现,适合需要批量处理大量文件、希望减少子shell启动开销的场景
find . -name "*.txt" -print0 | xargs -0 -I {} sh -c 'cd "$(dirname "{}")" && acmd "$(basename "{}")"'
这里额外加了-print0和-0参数,用空字符作为文件路径分隔符,完全兼容所有特殊字符的文件名,不会出现解析错误。
验证示例
你可以用下面的命令测试效果,会打印每个txt文件在自身目录下的权限信息,确认执行路径正确:
find . -name "*.txt" -exec sh -c 'cd "$(dirname "{}")" && ls -l "$(basename "{}")"' \;
内容的提问来源于stack exchange,提问作者Atsushi Sakai
相关产品推荐
相关产品推荐

