如何转到当前树中某个深度的目录?

如何转到当前树中某个深度的目录?

我通常在同一服务器的多个文件夹( dev1dev2和)中工作。dev3文件夹结构类似于:

  • /var/www/html/dev1/a/b/c/d/e/f
  • /var/www/html/dev2/a/b/c/d/e/f
  • /var/www/html/dev3/a/b/c/d/e/f

当我位于某个文件夹(例如cdeof )时/var/www/html/dev3/,是否有命令将我带到/var/www/html/dev3/a

如果我从文件夹or或/var/www/html/dev1/a运行命令,相同的命令应该带我去。cde/var/www/html/dev1/

答案1

方法#1 - 相对 CD

从当前位置向上移动一定深度的最简单方法是执行以下命令:

$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ cd ../../../../..

$ pwd
/Users/sammingolelli/adir/dev3/a

方法#2-pushd/popd

除此之外,您还可以使用pushdandpopd充当堆栈,维护 FIFO 或您在用于pushd转到目录时告诉它的目录,然后popd返回到堆栈上先前推送的目录。

例子
$ pwd
/Users/sammingolelli/adir/dev3/a
$ dirs
~/adir/dev3/a

$ pushd b/c/d/e/f/
~/adir/dev3/a/b/c/d/e/f ~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ popd
~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a

方法#3 - 别名

您还可以创建一个别名来执行您想要的操作。网站上已有的几个问答对此进行了介绍,或者参见 @fastrizwaan 的回答。

方法 #4 - CDPATH

看看这个答案@工作的人,关于这个问答: 终端中的快速目录导航

更多,使用工具?

以上两种方法是最常用的移动方法。当然,您还可以安装其他工具作为导航工具。本网站已讨论了许多此类工具。我想到的一个是书签工具,它允许您为特定目录添加“书签”并将其映射到一个短名称,以便您可以从任何地方轻松更改到它。

自动跳转

我在本问答中讨论了一个这样的工具,标题为:如何创建短路径?。该工具称为自动跳转

其他的

还有其他一些,在标题为“问答”中建议的:终端中的快速目录导航

答案2

这是一个功能的工作。假设您的 shell 是 bash,您可以在.bashrc.该功能将在您下次启动 bash 时可用。

cdwww () {
}

应该做什么?肯定是命令cd。当前目录的路径在变量中PWD,您可以使用字符串处理和其他构造。

/var/www/html例如,如果当前目录位于 下,则以下函数将转到当前目录的上一层目录/var/www/html

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

您可以使此函数接受 的不同子目录的路径/var/www/html/dev*/a

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}/$1"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

另一种方法是每当更改目录时将变量设置为目标目录。以下代码安排在chpwd每次当前目录更改时执行该函数。

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    html_root="${PWD%"$d"}"
  else
    unset html_root
  fi
}

然后你可以使用cd $html_root(或者$html_root如果你已经打开shopt -s autocd)。

答案3

现在我明白了你的问题:

cd $(pwd|cut -c 1-18)/a

会带你到/var/www/html/dev1/a当你在下面或里面的时候,dev1以及/var/www/html/dev2/a当你在下面或里面的时候,dev2等等。

cut这里似乎是一个黑客,18当你的路径改变时你已经改变了,但我没有找到使用正则表达式的更优雅的解决方案。

答案4

zsh

cd $PWD[1,(rn[5])/]

会将该cd字符串$PWD从第一个字符开始并在第一个字符出现结束,因此:15/

1 2 3 4 5
/var/www/html/dev1/a/b/c/d/e/f

那会做一个cd /var/www/html/dev1/.

您可以创建一个辅助函数:

cdd() cd $PWD[1,(rn:argv[1]:)/]

例如,在作为参数给出的 epth内cd$PWDdcdd 5

相关内容