在 linux 命令行上反向目录搜索

Reverse directory search on linux command line

我有一个自定义 linux 提示,它显示各种有用的信息块。当我在日常工作中使用 SVN 时,我认为使用有关当前工作区的信息进一步自定义提示会很好 URL。这主要是由最近的一个案例引起的,我切换到一个分支然后忘记了我已经这样做了。百思不得其解,为了避免再次发生这种情况,我觉得这似乎是个好主意。

这已经被其他人实现了,所以我可以按照他们的例子来做,但我也喜欢从基本原则出发。关于其他人的解决方案,我观察到的一件事是他们倾向于在不考虑上下文的​​情况下执行 'svn info'。这本身不是问题,但我认为在调用 'svn info'.

之前测试无处不在的“.svn”目录的存在可能会很好

我得出了这个部分解决方案:

if [ -d './.svn' ] ; then svn info | sed -n -e '/^URL/ s/.*svn//p' ; fi;

在存在“.svn”目录的情况下,我调用 'svn info' 然后使用 sed 吐出我感兴趣的 URL 部分。

问题是,自 svn 1.7 以来,'.svn' 并不是无处不在的!

我曾想过我可以用调用 'find' 来替换目录测试以执行反向目录搜索以搜索目录树...除了似乎没有这样的一种能力。

除了完全放弃对“.svn”的测试之外,有人可以建议我如何测试当前位置和所有父文件夹中是否存在所述文件夹吗?

非常感谢。

此函数将从当前目录向上查找“.svn”目录:

is_svn () { 
    local dir=$PWD 
    while [[ $dir != "/" ]]; do  
        [[ -d "$dir/.svn" ]] && return 0
        dir=$(dirname "$dir")
    done
    return 1
}

然后,您的提示可以包含类似

的内容
$( is_svn && svn info | ... )

首先。不要将工作副本用于多个 branches/trunk。根本没有理由这样做。检查特定项目的特定分支通常需要不到五分钟的时间。而且,在这个千兆字节和 TB 大小的硬盘驱动器时代,没有理由节省空间。 (我的第一个硬盘驱动器是 40 megabytes。而且,我过去常常支配只有 10 和 20 的同事字节硬盘)。

你节省的时间和磁盘 space 会在你第一次不小心使用错误的分支时丢失,因为你忘记了你已经切换了。

检查您是否在 Subversion 工作副本中的最佳方法是 运行 svn info 并查看退出值是多少。如果它不为零,则说明您不在 Subversion 工作目录中。

如果你真的想在你的提示中有 repo 根(或类似的东西),我建议你在你的提示命令中使用这样的序列:

PS1="\u@\h:\w ($(svn info --xml 2> /dev/null | sed -n '/<relative-url>/s/<.*>\(.*\)<.*>//p'))\n$ "