我有一个运行 mysql 脚本的 bash 脚本,它从文件中获取 mysql 数据库名称,而不是让我将其作为选项输入(这样我就不会错误地输入错误的名称)。我通过将 mysql 数据库名称放入名为 mysql_db_name 的文件中来设置此设置,该文件要么与我正在运行的脚本位于同一目录中,要么位于其目录路径中该目录之上的某个位置:它可能位于父目录、父目录的父目录中等. 当我输入时,这个 bash 脚本会运行 mysql 脚本:
bash_script mysql_script_name
我想让我的 bash 脚本在 mysql_script_name 脚本的路径中找到名为 mysql_db_name 的顶级文件。
我当前执行此操作的代码片段是:
MFILE=`find / -exec bash -c '[[ $PWD != "$1"* ]]' bash {} \; -prune -name mysql_db_name -print`
这通常有效,但如果父目录中存在另一个目录,其中包含名为 mysql_db_name 的文件,且该文件的目录名是当前目录名的子集,则该方法无效。例如,如果存在:
parent/directory1/mysql_db_name
parent/directory11/mysql_db_name
parent/directory11/mysql_script_name.sql
然后,如果我尝试在
mysql_script_name
中运行 directory11
,bash_script 将失败。如果上面的directory1
被命名为directory2
,它就不会失败。
这个问题类似于使用 bash 在目录树中按名称查找文件,但我无法让这些解决方案发挥作用。
如果您知道文件名及其所在的目录路径,那么无论如何都没有合理的理由在这里使用
find
。
path=/path/to/deepest/possible/dir/containing/the/file
while [ "$path" ]; do
test -e "$path/mysql_db_name" && break
path=${path%/*}
done
test -e "$path" || { echo "$0: mysql_db_name not found" >&2; exit 2;}
: proceed to use "$path"