我有一个源代码树,其根目录是/home/me/workspace
。有很多级别的子目录很多。特别是有一个包含一些工具的路径:
/home/me/workspace/tools/scripts
我正在编写一个bash函数,我可以从树中的任何地方调用我传递字符串tools/scripts
。该函数应该从当前工作目录迭代到/
寻找路径片段tools/scripts
,然后如果找到它,则打印出找到它的绝对路径。在此示例中,将打印/home/me/workspace
。如果根本找不到路径片段,则不会打印任何内容。
我已经有了以下bash函数,它为我做了这个:
search_up ()
(
while [ $PWD != "/" ]; do
if [ -e "$1" ]; then
pwd
break
fi
cd ..
done
)
但这看起来有点啰嗦。我想知道是否有任何其他方法可以在bash本身,或者可能是单个find
命令或任何其他常用实用程序中执行此操作。我特别注重可读性和简洁性。
注意我不正在寻找整个树的完整递归搜索。
另外我的bash不是最新的,所以请不要使用最新的,最棒的:
$ bash --version
GNU bash, version 3.00.15(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
$
答案 0 :(得分:2)
为了记录,以下是我最终使用的内容:
while [ $PWD != "/" ]; do test -e tools/bin && { pwd; break; }; cd .. ; done
与我的OP类似,但最后我能够完全删除子shell括号(),因为这行本身是使用来自另一个程序的“shell”命令调用的。因此也把它全部塞进一条线上。
我仍然喜欢KonsoleBox作为一个可能更通用的解决方案,因此我接受了。
答案 1 :(得分:1)
这应该有效,但告诉我它是否需要与POSIX兼容。这样做的好处是您不需要将目录更改为更高级别来进行搜索,也不需要使用子shell。
#!/bin/bash
search_up() {
local look=${PWD%/}
while [[ -n $look ]]; do
[[ -e $look/$1 ]] && {
printf '%s\n' "$look"
return
}
look=${look%/*}
done
[[ -e /$1 ]] && echo /
}
search_up "$1"
示例:
bash script.sh /usr/local/bin
输出:
/