Bash脚本文件比较出现No such file or directory错误,求修复
修复你的Bash文件移动脚本
嘿,作为Bash新手遇到这种问题很正常,我来帮你一步步排查和修复:
你的脚本存在的几个关键问题
- 括号与表达式之间缺少空格:Bash的
[(test命令的别名)需要和后面的表达式之间有空格,]前面也需要空格。你写的["~/new1/$input" -ef $F]会被shell当成一个不存在的命令[~/new1/...,这就是你看到No such file or directory错误的直接原因。 ~在引号中不会展开:双引号里的~不会被解析为用户家目录,应该使用$HOME替代,或者去掉引号让~正常展开。- 文件路径错误:循环变量
F是~/new2/下的文件名,直接用$F会指向当前目录下的文件,而不是~/new2/里的,所以比较时需要补全路径。 - 用
ls遍历文件的风险:$(ls ~/new2/)在文件名包含空格、特殊字符时会拆分出错,推荐直接用通配符~/new2/*遍历。 - 冗余的循环逻辑:其实不用遍历
new2的所有文件,直接检查目标路径~/new2/$input是否存在即可,更高效。
修复后的完整脚本
#!/bin/bash while true; do echo "Enter a file name from directory new1 to move it to directory new2," echo "or press Ctrl+C to exit: " read -r input # -r选项避免read解析转义字符 # 直接检查new2中是否存在该文件 if [ ! -e "$HOME/new2/$input" ]; then # 先检查new1中的文件是否存在,避免mv报错 if [ -e "$HOME/new1/$input" ]; then mv "$HOME/new1/$input" "$HOME/new2/" echo "$input moved successfully" else echo "Error: File '$input' does not exist in ~/new1/" fi else echo "File '$input' already exists in ~/new2/" fi done
额外的优化说明
- 添加了
#!/bin/bash指定解释器,确保脚本用Bash运行。 - 用
read -r避免read命令解析输入中的转义字符(比如\)。 - 增加了对
~/new1/$input是否存在的检查,避免mv命令因为源文件不存在而报错。 - 所有变量都用双引号包裹,防止文件名包含空格或特殊字符时出现问题。
内容的提问来源于stack exchange,提问作者z.k
相关产品推荐
相关产品推荐

