如何仅在文件及对应路径存在时执行文件移动操作?
问题分析与解决方案
原命令执行失败的核心原因是shell运算符优先级:&&的优先级高于||,导致你的命令实际逻辑是:如果文件不存在,就执行mkdir -p src/examples/,但无论文件是否存在,都会执行后面的mv命令——这就导致文件不存在时mv报错。
修正原命令(实现“仅文件存在时执行mv”)
要让mkdir和mv作为一个整体,在文件存在时才执行,需要用括号(子shell)或大括号将它们包裹:
方式1:用子shell(括号)
[ ! -f src/java/world.java ] || (mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java)
方式2:用大括号(更高效,无额外子shell)
注意大括号前后的空格和结尾的分号:
[ ! -f src/java/world.java ] || { mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java; }
需求1:检查src、src/java目录及文件是否存在
如果需要明确检查这三个路径的存在性,可以分步判断,或者整合到命令中:
分步检查(输出提示)
# 检查src是否为目录 if [ ! -d src ]; then echo "src目录不存在" fi # 检查src/java是否为目录 if [ ! -d src/java ]; then echo "src/java目录不存在" fi # 检查目标文件是否存在 if [ ! -f src/java/world.java ]; then echo "src/java/world.java文件不存在" fi
整合到原命令中(仅当所有路径都合法时才执行操作)
if [ -d src ] && [ -d src/java ] && [ -f src/java/world.java ]; then mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java fi
需求2:让命令执行失败时仍返回0值
只需在命令末尾添加|| true,强制命令最终返回0(即使中间步骤失败):
针对修正后的命令
[ ! -f src/java/world.java ] || { mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java; } || true
针对整合检查的命令
if [ -d src ] && [ -d src/java ] && [ -f src/java/world.java ]; then mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java || true fi
内容的提问来源于stack exchange,提问作者placplacboom
相关产品推荐
相关产品推荐

