Linux shell 编程常见问题
- 2025-12-30 19:06:00
- 丁国栋
- 原创 14
find 命令使用问题
为什么执行find命令,在bash shell中执行 find . -type d -name .git -exec rm -rf '{}' \; 没有报错,而放到 xxx.sh 脚本中用bash xxx.sh 中单独执行就提示find: ‘./package/ipd/.git’: No such file or directory?
这个问题的根本原因是 find 命令的遍历顺序与文件删除操作的实时性冲突。
问题分析
当你在 bash shell 中直接执行时:
find . -type d -name .git -exec rm -rf '{}' \;
而在脚本中执行时出现错误,是因为:
- 遍历顺序不同:find 命令在遍历目录树时,可能先访问到子目录中的
.git目录 - 实时删除:
-exec rm -rf '{}' \;会立即删除找到的目录 - 后续遍历失败:当 find 继续遍历时,如果尝试进入已被删除的目录或其子目录,就会报错
解决方案
方案:使用 -depth 参数
find . -depth -type d -name .git -exec rm -rf '{}' \;
-depth 参数让 find 先处理子目录,再处理父目录,避免遍历已删除的目录。
为什么终端和脚本行为不同?
在终端中可能没有遇到深层嵌套的 .git 目录,或者目录结构比较简单。而在脚本执行时,可能遇到了更复杂的目录结构,导致了这种时序问题。
--
发表评论