如何在Bash中查找以2开头的数字目录名并保存为变量
解决Bash脚本中获取指定目录名并创建新目录的问题
原脚本的核心问题
- 变量赋值错误:直接写
existing_dir=find ...会把字符串"find"赋值给变量,而非执行find命令的结果,必须用命令替换语法$()包裹命令。 - 匹配规则不严谨:原脚本的
"2*"会匹配所有以2开头的目录(比如2abc),无法筛选出纯数字目录;且缺少-name/-regex这类匹配选项,find无法识别该参数。 - 无错误检查:如果找不到目标目录,后续的
rm、mkdir会直接报错,导致脚本异常终止。
修复后的完整脚本
#!/bin/bash # 先检查PARENT_DIR变量是否已定义 if [ -z "$PARENT_DIR" ]; then echo "错误:PARENT_DIR变量未定义" exit 1 fi # 查找父目录下唯一以2开头的纯数字目录,仅返回目录名而非完整路径 # -regex 确保匹配纯数字目录,-printf "%f\n" 直接输出目录名 existing_dir=$(find "$PARENT_DIR" -maxdepth 1 -type d -regex ".*/2[0-9]\+$" -printf "%f\n") # 检查是否找到目标目录 if [ -z "$existing_dir" ]; then echo "错误:未找到以2开头的纯数字目录" exit 1 fi # 检查是否存在多个符合条件的目录(确保唯一性) if [ $(echo "$existing_dir" | wc -l) -gt 1 ]; then echo "错误:找到多个以2开头的纯数字目录" exit 1 fi # 删除旧目录(-rf 强制删除非空目录) rm -rf "$PARENT_DIR/$existing_dir" # 计算新目录序号并创建 new_dir=$((existing_dir + 1)) mkdir -p "$PARENT_DIR/$new_dir" # 进入新目录执行后续操作(示例) cd "$PARENT_DIR/$new_dir" || exit 1 echo "已进入新目录:$new_dir,开始执行操作..."
关键细节说明
- 匹配规则:
-regex ".*/2[0-9]\+$"确保目录名是纯数字且以2开头:.*/匹配父目录路径,2[0-9]\+匹配2开头的1个或多个数字,$确保目录名无额外字符。 - 安全处理:所有变量引用加双引号,避免路径含空格、特殊字符时出现错误;
rm -rf、mkdir -p增强命令的容错性。 - 唯一性校验:通过
wc -l检查结果行数,确保只找到一个符合条件的目录,避免误操作。
内容的提问来源于stack exchange,提问作者new_sysadmin
相关产品推荐
相关产品推荐

