Windows命令行中/**/*通配符无法递归匹配所有层级文件的问题求助
排查Cygwin中
**通配符仅匹配第二层目录的问题 我之前维护Cygwin环境时也碰到过类似的通配符递归失效问题,结合你描述的场景——仅更新过Windows系统、未修改Cygwin配置,给你几个具体的排查和修复方向:
检查Cygwin Shell的
globstar配置
Cygwin的Bash shell依赖globstar选项来启用**的递归匹配功能,Windows系统更新可能意外重置了这个配置。- 先在终端执行
shopt | grep globstar查看当前状态:- 如果输出是
globstar off,说明递归匹配被关闭了
- 如果输出是
- 临时开启:执行
shopt -s globstar,然后立刻测试echo dir/**/*是否能返回所有层级文件 - 永久生效:把
shopt -s globstar添加到你的~/.bashrc或~/.profile文件末尾,下次启动终端就会自动启用
- 先在终端执行
区分是通配符展开问题还是程序自身问题
Closure Compiler的文件参数可能受两种情况影响:- 如果是Cygwin Shell帮你展开通配符:那和
echo dir/**/*的问题是同一个根源,解决上面的globstar问题即可 - 如果是程序自身处理通配符:可以用
find命令绕过Shell的通配符,直接传递所有文件路径给程序测试:
如果这个命令能正常处理所有层级文件,说明问题出在Shell的通配符配置,而非程序本身find dir -type f | xargs java -jar closure-compiler.jar
- 如果是Cygwin Shell帮你展开通配符:那和
验证文件系统访问权限
Windows系统更新可能修改了某些目录的权限,导致Cygwin无法访问深层子目录。你可以用find dir -type f命令测试,如果能列出所有层级的文件,说明权限没问题;如果某些深层文件无法被find找到,需要检查对应目录的Windows权限,确保Cygwin运行的用户有读取权限重置Cygwin Shell配置文件
极端情况下,Windows更新可能意外篡改了Cygwin的Shell配置文件(比如.bashrc)。你可以先备份当前的~/.bashrc,然后从Cygwin的安装目录(通常是C:\cygwin\etc\skel\.bashrc)复制默认模板覆盖,之后重启终端测试通配符功能是否恢复
内容的提问来源于stack exchange,提问作者user1060817
相关产品推荐
相关产品推荐

