Git Bash中如何进入首个可用目录?求跨平台兼容方案
跨平台进入首个子目录的解决方案(适配GitHub Actions)
在Linux环境中,若当前目录仅有一个子目录,cd */可以正常进入,但存在多个子目录时(包括Git Bash环境),该命令会因参数过多报错bash: cd: too many arguments。要实现跨平台(Linux、Windows Git Bash)且适配GitHub Actions的「进入首个子目录」功能,可采用以下可靠方案:
核心思路
避免直接让cd处理多个参数,先通过数组或命令获取排序后的首个子目录路径,再执行cd操作,同时处理目录不存在的异常情况。
方案1:通用Bash脚本
适用于本地Linux、Git Bash或GitHub Actions的bash步骤:
# 将当前目录下所有子目录存入数组(按名称字典序排序) subdirs=(*/) # 检查是否存在子目录 if [ ${#subdirs[@]} -gt 0 ]; then # 进入第一个子目录,引号包裹避免目录名含空格/特殊字符 cd "${subdirs[0]}" echo "已进入目录: $(pwd)" else echo "错误:当前目录下无可用子目录" exit 1 fi
方案2:GitHub Actions 工作流写法
直接在Workflow中定义步骤,指定bash shell确保跨runner兼容:
steps: - name: 切换至首个子目录 run: | subdirs=(*/) if [ ${#subdirs[@]} -gt 0 ]; then cd "${subdirs[0]}" echo "当前工作目录已更新为: $(pwd)" # 将新路径写入环境变量,供后续步骤使用 echo "PWD=$(pwd)" >> $GITHUB_ENV else # 输出GitHub Actions错误信息,终止流程 echo "::error::当前目录下未找到子目录" exit 1 fi shell: bash
扩展:按修改时间进入最新子目录
如果需要进入最近修改的子目录而非名称排序的首个目录,可改用find命令实现(兼容所有bash环境):
# 查找当前目录下的子目录,排除自身,按修改时间降序排序后取第一个 latest_dir=$(find . -maxdepth 1 -type d ! -name "." -printf "%T@ %p\n" | sort -nr | head -n 1 | cut -d' ' -f2-) if [ -n "$latest_dir" ]; then cd "$latest_dir" echo "已进入最新修改的目录: $(pwd)" else echo "错误:当前目录下无可用子目录" exit 1 fi
内容的提问来源于stack exchange,提问作者Atlinx
相关产品推荐
相关产品推荐

