Cygwin环境Shell脚本遍历Windows目录解决路径空格分隔问题
问题根源
你当前写法的核心问题是:for dir in $dirlist 会默认按照shell内置的IFS(内部字段分隔符,默认包含空格、换行、制表符)拆分变量内容,路径中自带的空格会被当作分隔符切割,导致路径被拆分。另外Cygwin环境下直接使用Windows风格的反斜杠路径也可能存在识别异常的问题。
可行修改方案
方案1:使用 while read 循环遍历(兼容性最好)
#!/bin/bash # 把Windows风格路径转换为Cygwin兼容的POSIX路径,规避反斜杠、空格识别问题 win_path="C:\Program Files (x86)" posix_path=$(cygpath -u "$win_path") # 按行读取find的输出,每行对应一个完整路径,不会被空格拆分 find "$posix_path" -mindepth 1 -maxdepth 1 -type d | while IFS= read -r dir do # 如需输出Windows风格路径,用cygpath -w转换即可 echo "$(cygpath -w "$dir")" # 其他处理逻辑写在这里即可 done
方案2:使用数组存储路径(Bash 4.0+支持)
#!/bin/bash win_path="C:\Program Files (x86)" posix_path=$(cygpath -u "$win_path") # 把find输出的每一行作为单独元素存入数组 mapfile -t dirlist < <(find "$posix_path" -mindepth 1 -maxdepth 1 -type d) # 遍历数组时用"${dirlist[@]}"保证每个路径作为单独元素处理 for dir in "${dirlist[@]}" do echo "$(cygpath -w "$dir")" done
注意事项
- 所有变量引用都要用双引号包裹,比如
"$dir"、"$posix_path",避免变量展开时被IFS拆分 - Cygwin环境下优先使用
cygpath工具做Windows路径与POSIX路径的转换,可规避绝大部分路径识别问题
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

