WSL中Bash循环执行rsync提示文件/目录不存在的问题
问题分析与解决
错误原因
你在执行rsync时犯了关键语法错误:把整个rsync命令(包括参数)用双引号包裹起来了。bash会将被双引号包裹的整串内容当作一个单一的命令名称去系统路径中查找,而不是识别成rsync命令加后续参数。系统中不存在名为rsync -urv /mnt/c/...的命令,因此才会抛出"No such file or directory"错误——这个错误不是指源/目标目录不存在,而是指你试图执行的"命令"不存在。
修复步骤
- 移除命令两端的双引号:直接调用
rsync命令并传入参数,不要把整个命令行用引号包裹。 - 给变量加上双引号:确保路径中包含空格或特殊字符时,bash不会错误拆分路径。
- 修正条件判断的语法:
[ -d "$source_1"]中]前缺少空格,这是bash条件判断的规范要求,否则可能导致意外的语法错误。
修正后的完整脚本
#!/bin/bash # 定义rsync的源目录和目标目录 source_1="/mnt/c/User/username/path/to/source_1" target_1="/mnt/c/User/username/path/to/target_1" target_2="/mnt/c/User/username/path/to/target_2" # 声明目标目录数组 declare -a target_dirs=("$target_1" "$target_2") rsync_test(){ for i in "${target_dirs[@]}" do echo "rsyncing: $i" # 修正条件判断的空格问题 if [ -d "$i" ] && [ -d "$source_1" ]; then echo "[ -d $i ] && [ -d $source_1 ] = true!" # 移除命令的双引号,并给变量加双引号 rsync -urv "$source_1" "$i" else echo "[ -d $i ] && [ -d $source_1 ] = false!" fi done }
额外说明
给变量$source_1和$i加上双引号是非常必要的,因为Windows路径(通过WSL的/mnt/c访问)经常包含空格(比如带空格的用户名或目录名),不加双引号会导致bash将路径拆分成多个参数,rsync会无法识别正确的目录路径。
内容的提问来源于stack exchange,提问作者pmyarbrough
相关产品推荐
相关产品推荐

