![如何转到当前树中某个深度的目录?](https://linux22.com/image/68635/%E5%A6%82%E4%BD%95%E8%BD%AC%E5%88%B0%E5%BD%93%E5%89%8D%E6%A0%91%E4%B8%AD%E6%9F%90%E4%B8%AA%E6%B7%B1%E5%BA%A6%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我通常在同一服务器的多个文件夹( dev1
、dev2
和)中工作。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
当我位于某个文件夹(例如c
或d
或e
of )时/var/www/html/dev3/
,是否有命令将我带到/var/www/html/dev3/a
?
如果我从文件夹or或/var/www/html/dev1/a
运行命令,相同的命令应该带我去。c
d
e
/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
除此之外,您还可以使用pushd
andpopd
充当堆栈,维护 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
从第一个字符开始并在第一个字符出现时结束,因此:1
5
/
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
。$PWD
d
cdd 5