Bash脚本mv重命名目录报错不存在但目录实际存在的问题求解
报错的可能原因汇总
1. 目标路径父目录不存在
这是最容易被忽略的常见坑:不少mv实现(比如busybox版mv)在目标路径的上级目录不存在时,报错信息只会提示源路径不存在,和源路径真的不存在的报错完全一致。
你需要先确认other/path的所有上级目录是否存在,如果不存在需要提前创建:
if [ -d some/path ]; then mkdir -p "$(dirname "other/path")" mv some/path other/path fi
2. 相对路径的工作目录发生切换
你代码中用的是相对路径,若-d判断和mv执行两个操作之间,脚本执行了cd切换工作目录,就会导致判断时路径有效、执行mv时路径无效的情况。
建议把路径改为绝对路径,或者在脚本开头固定工作目录:
# 固定为脚本所在目录,也可以替换为你要使用的固定目录 cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1
3. 竞态条件问题
目录存在性判断和mv操作之间存在时间差,即使间隔极短,也可能有其他进程、定时任务、并发执行的脚本逻辑把some/path删除、移动,导致mv执行时源路径已经不存在。
4. 路径存在不可见字符
你核验的是肉眼可见的路径拼写,但若路径中包含空格、换行、零宽空格等不可见字符,手动检查很难发现,find的普通输出也不会显式标注。可以用以下命令打印路径的实际字符编码确认:
echo "some/path" | od -c
5. 脚本执行上下文和手动测试不一致
如果你是手动执行find确认路径存在,但脚本是通过cron、systemd服务、其他程序调用执行的,这些执行上下文的默认工作目录通常和你手动操作的目录不一致,相对路径的基准目录不同,自然找不到对应路径。
内容的提问来源于stack exchange,提问作者Ian Fako
相关产品推荐
相关产品推荐

