如何在Bash中查找指定脚本路径下最顶层的mysql_db_name文件?
如何在Bash中查找指定脚本路径下最顶层的mysql_db_name文件?
看起来你遇到的问题是原命令用了字符串匹配判断目录关系,当父目录里有名字是当前目录子集的目录时(比如directory1和directory11),字符串匹配会误判,导致找到错误的mysql_db_name文件。咱们换个更可靠的思路:从目标脚本的实际目录出发,逐层向上遍历父目录,基于真实的文件系统层级查找,完全避开字符串匹配的坑。
核心思路
- 先拿到你要执行的MySQL脚本的绝对路径,确保不管你在哪个目录运行命令,都能精准定位到脚本所在的文件夹。
- 从这个文件夹开始,一层一层往上走(直到根目录),检查每个目录下有没有
mysql_db_name文件。 - 根据你的需求选择:
- 找**最顶层(最靠近根目录)**的文件:遍历过程中不断更新找到的文件路径,直到根目录,最后保留的就是最顶层的。
- 找离脚本最近的文件:一旦找到就停止遍历,拿到的就是最近的那个。
完整的脚本实现
把下面的逻辑整合到你的bash脚本里就行:
#!/bin/bash # 先检查参数是否正确 if [[ $# -ne 1 ]]; then echo "用法: $0 <mysql_script_name>" exit 1 fi SCRIPT_PATH="$1" # 验证目标脚本是否存在 if [[ ! -f "$SCRIPT_PATH" ]]; then echo "错误: 脚本 '$SCRIPT_PATH' 不存在,请检查路径" exit 1 fi # 获取脚本的绝对路径和所在目录 SCRIPT_ABS=$(realpath "$SCRIPT_PATH") SCRIPT_DIR=$(dirname "$SCRIPT_ABS") # 开始向上查找最顶层的mysql_db_name current_dir="$SCRIPT_DIR" MFILE="" while [[ "$current_dir" != "/" ]]; do DB_FILE="$current_dir/mysql_db_name" if [[ -f "$DB_FILE" ]]; then # 找到就更新路径,继续往上找更顶层的 MFILE="$DB_FILE" fi # 进入父目录 current_dir=$(dirname "$current_dir") done # 最后检查根目录有没有 if [[ -f "/mysql_db_name" ]]; then MFILE="/mysql_db_name" fi # 检查是否找到文件 if [[ -z "$MFILE" ]]; then echo "错误: 从脚本目录到根目录的路径中,未找到mysql_db_name文件" exit 1 fi # 读取数据库名 DB_NAME=$(cat "$MFILE") echo "成功找到数据库名: $DB_NAME" # 这里放你执行MySQL脚本的命令,比如: # mysql -u your_username -p "$DB_NAME" < "$SCRIPT_ABS"
为什么这个方法能解决你的问题?
你原来的find命令用了[[ $PWD != "$1"* ]]这种字符串匹配来判断目录关系,当目录名有包含关系时(比如directory1和directory11),parent/directory11的字符串会被误判为parent/directory1的子串,导致find没有排除这个目录,最终找到错误的文件。
而新方法是基于真实的文件系统层级遍历,完全不依赖字符串匹配,只会沿着脚本目录的父目录一步步往上找,绝对不会出现误判的情况,而且比遍历整个根目录的find命令高效得多。
如果要找离脚本最近的文件?
只要把循环里的逻辑改一下,找到文件就立刻停止遍历:
while [[ "$current_dir" != "/" ]]; do DB_FILE="$current_dir/mysql_db_name" if [[ -f "$DB_FILE" ]]; then MFILE="$DB_FILE" break # 找到就停止,拿最近的那个 fi current_dir=$(dirname "$current_dir") done
备注:内容来源于stack exchange,提问作者Rich P
相关产品推荐
相关产品推荐

