我想经常在完全不相关的路径中切换目录,例如/Project/Warnest/docs/~/Dropbox/Projects/ds/test/

但是我不想一直输入cd /[full-path]/

我可以想到的一种解决方案是将环境变量添加到我的bash .profile中,将常用目录添加到cd中,并使用这些变量添加到它们中。 />
但是还有其他解决方案吗?

评论

符号链接也可能对此有用。 en.wikipedia.org/wiki/…

#1 楼

如果仅在两个目录之间切换,则可以使用cd -来回切换。

评论


这么长的时间使我难以捉摸的是一个谜。非常感谢您提供的出色提示。

– Shickadance先生
2012年2月9日15:21

+1当然是我的最爱之一,而有些专家以某种方式“错过了”。

–迈克尔·杜兰特(Michael Durrant)
2012年4月24日在2:17



#2 楼

CDPATHbash中有一​​个外壳变量kshcdpath中有一​​个zsh


CDPATH    The search path for the cd command. This is a colon-separated
          list of directories in which the shell looks for destination
          directories specified by the cd command.



因此可以在〜/ .bashrc中进行设置:

export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds


然后cd docscd test将带您到第一个找到的此类目录。 (我的意思是,即使当前目录中存在相同名称的目录,仍会查询CDPATH。如果CDPATH将包含更多具有给定名称的子目录的目录,则将使用第一个。)

评论


应该提到的是,通常,您希望$ CDPATH中的第一个条目为。 (显式条目,即:也可以)。否则,您将得到奇怪的行为,其中CDPATH目录优先于当前工作目录中的目录,而您可能不希望这样做。

– jw013
2012年2月8日在23:40

我几乎做同样的事情,但是没有输出。这样,CDPATH不会导出到具有潜在奇怪或有害影响的脚本。有关更多讨论和示例,请参见此处。

– Telemachus
2012-02-17 12:47

“ zsh中的bash,ksh和cdpath”……以及tcsh(仅在超级用户上基于该问题回答一个问题,并在SE上寻找类似答案时发现了这个问题)。

–亨尼斯
13年11月13日在7:36



我认为这是POSIX指定的。至少,用于CD的POSIX引用了它。

–mikeserv
2014年8月30日17:47

#3 楼

您可能尝试的其他方法是称为自动跳转的工具。它保留对其别名(默认为j)的调用的数据库,并尝试对要去的地方做出明智的决定。例如,如果您经常键入:

j ~/Pictures


您可以使用以下命令在紧急情况下到达此处:

j Pic


它在Debian和Ubuntu中可用,默认情况下按用户包括在~/.bashrc~/.zshrc中。

评论


Autojump可能是最好的工具,建立普通目录数据库需要花费一些时间,但是一旦实现,我想您会发现没有它就无法生存。我知道每次我在别人的计算机上时都会感到残废。

–quodlibetor
2012年2月13日在18:29

谢谢喜欢这个工具!尽管cd-可以方便地知道您是否还不知道它,但我认为这是比当前最佳答案更好的解决方案。

–用户
2014年10月13日在4:49

全系统安装在什么系统上?

–ctrl-alt-delor
17年1月17日在16:13

@richard它可以作为软件包(例如Ubuntu中的apt-get install autojump,也可以用于其页面上记录的许多其他软件包)用于系统范围的安装,但是每个用户都需要将其加载到其shell环境中,以便可以覆盖cd跟踪您要去的地方

–nealmcb
17年4月6日在17:56



重要的一点是应该将源/usr/share/autojump/autojump.sh添加到〜/ .bashrc中,以使自动跳转正常工作。

– Pablo A
17年7月10日在2:10

#4 楼

如果目录数量较少,则可以使用pushd在它们之间进行旋转:

# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test


cd -不同,您可以将其用于两个以上的目录


按照Noach的建议,我现在使用的是:

function pd()
{
    if [[ $# -ge 1 ]];
    then
        choice=""
    else
        dirs -v
        echo -n "? "
        read choice
    fi
    if [[ -n $choice ]];
    then
        declare -i cnum="$choice"
        if [[ $cnum != $choice ]];
        then #choice is not numeric
            choice=$(dirs -v | grep $choice | tail -1 | awk '{print }')
            cnum="$choice"
            if [[ -z $choice || $cnum != $choice ]];
            then
                echo "$choice not found"
                return
            fi
        fi
        choice="+$choice"
    fi
    pushd $choice
}


示例用法:

# same as pushd +1
$ pd 1

# show a prompt, choose by number
$ pd
 0 ~/Dropbox/Projects/ds/test
 1 /Project/Warnest/docs
 2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs

# or choose by substring match
$ pd
 0 /tmp
 1 ~/Dropbox/Projects/ds/test
 2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test

# substring without prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp


等显然,这仅用于在堆栈中旋转,并且不处理添加新路径-也许我应该重命名。

评论


哦,我知道要进行遍历的推动和弹出操作,但不是那样推动就可以旋转到目前为止使用的内容...

–伊兹卡塔
2012年2月8日在20:29

#5 楼

我在bashrc中使用alias来制作这些CD。
例如:

alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'


评论


是bashrc是.profile之类的文件吗?我需要在其中添加这些行?

–saiy2k
2012年2月8日在7:43



〜/ .bashrc或/etc/bash.bashrc。我以前没有使用过.profile,所以不知道它们之间的关系:-(

–费利克斯·严(Felix Yan)
2012年2月8日在7:45

脚本bashrc将在您每次打开终端时启动。配置文件启动。

–user14517
2012年2月8日在10:42

将这些行添加到我的.bash_profile中,效果很好.. thx :)

–saiy2k
2012年2月8日在10:56

我建议将别名放在〜/ .bash_aliases中以进行维护。它要求您的.bashrc知道此文件,如果添加[-f〜/ .bash_aliases];然后 。 〜/ .bash_aliases您的.bashrc中的fi(可能已经存在)

– Sumak
20年8月25日在10:01

#6 楼

使用“ pushd -n”(假设您使用bash)。

添加到您的〜/ .bashrc中:

pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/


然后,
/>
cd ~是您的家,

cd ~1~/Dropbox/Projects/ds/test/

cd ~2/Project/Warnest/docs/

您可以完全使用~1~2等与~相同。

#7 楼

我找到了一个脚本(通常称为acd_funch.sh)为我解决了此问题。这样,您可以键入cd --来查看已使用的最后10个目录。它看起来像这样:

0  ~/Documents/onedir
1  ~/Music/anotherdir
2  ~/Music/thirddir
3  ~/etc/etc


要进入~/Music/thirddir,只需键入cd -2

参考文献

< br scripts / acd_func.sh
SkyRocknRoll / acd_func.sh

注意:该脚本最初发布在linux gazette上,该文章可在此处找到:acd_func.sh-扩展了bash的CD保留,显示和访问已访问目录名称的历史记录。

评论


2004年12月,在Linux公报第109期中也发布了相同的脚本。

– Serge Stroobandt
13年6月20日在21:12

@Dean链接转到音乐视频,并显示Geocities已关闭。

–某事
2014年8月30日15:05

@somethingSomething添加了备用链接。

–院长
2014年8月30日在17:42

历史| grep光盘

–user2180794
19年2月12日在12:41

#8 楼

尝试使用bash中的cdable_vars shell选项。您使用shopt -s cdable_vars将其打开。

然后您需要设置变量export dir1=/some/path。最后是cd dir1等。
然后可以将其放入~/.bashrc中使其粘住。

#9 楼

这里有很多好的建议。使用哪个选项取决于您是否在目录中切换了固定目录,还是在寻找更通用的解决方案。

如果目录较小,则设置简单的别名(如Felix Yan所建议)将最容易使用。

如果您正在寻找更通用的解决方案(例如,许多不同的目录,会随着时间的推移而变化),那么我会使用push和popd(因为Useless)建议)。我个人觉得默认的push / popd很难使用,尤其是当您开始在许多文件夹之间切换时;但是我写了一些调整,使它变得更容易。将以下内容添加到您的bashrc中:

alias dirs='dirs -v'
pd () 
{ 
    if [ -n "" ]; then
        pushd "${1/#[0-9]*/+}";
    else
        pushd;
    fi > /dev/null
}



使用pd(作为pushd的缩写)来跳转到新文件夹,记住您所在的位置。
使用dirs查看已保存目录的列表。
使用pd 3跳至目录编号3。

示例用法:

$ PS1='\w$ '   ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
 0  ~/Dropbox/Public
 1  ~/Documents/spec
 2  ~/Documents/data
 3  ~
 4  /etc/defaults
 5  /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$ 


#10 楼

以下内容似乎适用于我测试过的一种情况,您可以在〜/ Bookmarks中将目录名称作为符号链接删除:

mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"

function ccd() { cd $(readlink "$HOME/Bookmarks/") ; }

ccd testdir && echo $PWD
# gives /tmp


评论


ccd()函数是否需要在终端提示符或其他地方键入?您能解释一下吗?

–saiy2k
2012年2月8日在8:41

@ saiy2k:对不起,是的。该功能行进入您的.bashrc(您可以在终端中键入以进行测试,但是当您关闭该窗口时该行将消失),设置“ testdir”测试用例之前的行成为/ tmp的名称。 ,最后一行是测试是否有效。

–乌尔里希·施瓦茨(Ulrich Schwarz)
2012年2月8日在17:19

#11 楼

您可能会比尝试j2做得更糟。
在自述文件中:

花很多时间在复杂的目录树上cd-ing?
j跟踪您的位置您去过那里以及花了多少时间,并提供了一种方便的方法来跳转到您实际使用的目录。

我广泛使用并推荐它。

#12 楼

我建议使用zsh,该外壳对于大多数cli程序的目录,文件甚至选项都是非常好的TAB完成。

我已经使用该外壳多年了,错过了它的功能。
编写zsh脚本也很有趣,因为有大量的单行代码可以每天为您提供帮助。

评论


由于bash具有相同的功能,因此无需更改为zsh即可完成TAB。对于其他功能,也许但并非如此。

– Peer Stritzinger
2012年2月9日在11:14

@PeerStritzinger Bash在BASH 4.0中引入了这种功能,但是与zsh相比,它仍然远远落后。说“都一样”肯定是不正确的。

–polemon
2012-2-22在0:02

好吧,zsh无疑是übershell,但只需完成制表符就无需更改(询问bash的问题)。此外bash 4.0是大约3年前推出的...

– Peer Stritzinger
2012-02-22 9:45



#13 楼

以我的经验,在shell中导航的最大加速就是使用其历史搜索功能。在Bash中,您可以通过按Ctrl + R并输入某种模式来向后搜索命令历史。然后,将该模式与历史记录中的先前条目进行匹配-可能是cd命令或其他操作-并在您键入时提出建议。只需按Enter键即可再次运行建议的命令。这在Bash中称为reverse-search-history,我喜欢它。这为我节省了许多按键操作,并节省了内部内存。

这是一件好事,因为您只需要记住命令的一小部分,例如DropWa即可区分两个历史记录条目cd ~/Dropbox/Projects/ds/test/cd /Project/Warnest/docs/

#14 楼

我还使用了这些别名(将它们添加到〜/ .bashrc中):

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'


与它们一起进入上一级目录要快得多(但它只能解决一半导航)。

评论


这些是有用的别名,但我不能完全确定它们是否可以满足OP的需求。您可能会考虑扩大答案,以建议这些答案如何直接对OP的问题有所帮助。

– HalosGhost
2014年7月11日在18:36

#15 楼

如果您使用的是zsh:



则不必键入cd,只需键入目录路径(/foo/bar/baz<Enter>等于cd /foo/bar/baz<Enter>

需要设置auto_cd选项

您可以使用Tab键扩展缩写路径(/u/sh/pi<Tab>扩展为/usr/share/pixmaps;也适用于文件名)


评论


Bash 4已获得shopt -s autocd,因此它不再是仅zsh的优点。

–吉尔斯'所以-不再是邪恶的'
2012年2月8日在23:44

#16 楼

有一个相当不错的工具可以快速更改目录:

xd-超快速目录更改器
http://xd-home.sourceforge.net/xdman.html

有点尴尬的是,您需要将其映射到bash配置文件或类似文件中,因为它仅输出目录

# function to do `cd` using `xd`
# -g turns generalized directory search command processing on
# which improves the whole thing a bit
f() 
{
        cd `/usr/bin/xd -g $*`
}


您可以执行以下操作:

# change to /var/log/a* (gives you a list to choose from)    
f vla
# to skip the list and go directly to /var/log/apache2
f vlapach


评论


将函数更改为f(){cd“ $(xd -g” $ @“)”;正确处理xd的参数中的空格目录和空格(您可能不需要路径)。如果您从未以其他方式使用xd,则可以选择执行xd(){cd“ $(command xd -g” $ @“)”; }(或者,使用/ usr / bin / xd代替命令xd –始终可以运行命令xd…,如果需要绕过它)。

–亚当·卡兹(Adam Katz)
19年6月5日在15:17



#17 楼

无论如何,您永远都不应在shell中键入完整路径。您始终可以使用:

soffice /P*/W*/*/mydoc*


代替

soffice /Project/Warnest/docs/mydoc.odt


评论


这就像制表符补全,但在各个方面都更糟

– Michael Mrozek
16年5月14日在18:41

除非Project是仅以P开头的文件,否则您不能使用带有同等数量的按键完成的制表符来完成此操作。此外,每次都必须等待完成,使用*无需等待。

– Gena2x
16年11月23日在12:08

我认为您会倒退-除非Project是唯一以P开头的文件,否则您将无法执行P *。制表符补全可以循环(默认情况下,在大多数Shell中;您需要在bash中将制表符重新绑定为菜单完成),并且在像这样的简单情况下立即解决,无需等待

– Michael Mrozek
16年11月23日在15:47

关于“您无法做到”-您可以尝试一下,如果您认为自己做不到,那您将失去全部要点。尝试echo / u * / b * / g ++

– Gena2x
16年11月23日在17:26



我理解您的意思,只要您确定键入的路径明确,它就会更快,但是/ P * / W * / * / mydoc *之类的东西听起来似乎可以正常工作,直到有一天您碰巧另一个与该glob匹配的文件,突然之间您一次打开了这两个文件。 / u * / * / g ++很少有字符,但是希望在我的以u开头的任何根文件夹的任何子文件夹中,没有别的名称是g ++。 (作为一个不错的折衷,在某些shell中,您可以使用tab随地扩展glob)

– Michael Mrozek
16-11-23在17:42



#18 楼

还有一个OLDPWD环境变量,根据IEEE 1003.1(POSIX),每次cd更改工作目录时,环境变量应使用先前的工作目录进行更新(对于奇怪的环境变量,请参见IEEE 1003.1-2008第2506页的80244行)。

#19 楼

还有一个专门为此创建的“ wcd”应用程序(也已经移植到cygwin上,因为我在使用它)。您可以使用它创建快捷方式,目录书签。还支持通配符。阅读/ usr / share / wcd中的手册页和文档应该会很有帮助。

http://manpages.ubuntu.com/manpages/hardy/man7/wcd.7.html

#20 楼

cdargs是用于标记目录的最有效工具:http://www.youtube.com/watch?v=uWB2FIQlzZg

评论


这是您关联的产品吗?

–卡扎尔克
13年2月27日在19:21

感谢您将我指向cdargs。只需在ubuntu上sudo apt-get cdargs即可。顺便说一句,youtube视频确实很糟糕,但是该工具很棒。

– DavidG
2014年7月21日16:00



#21 楼

我有同样的问题,首先找到了这个答案。我安装了实用程序z(https://github.com/rupa/z)。

这正是您要寻找的,因为z从您的cd命令中学习,并根据频率原理(频率和最近)跟踪目录。因此,在一次执行完两个cd命令之后,您可以执行以下操作:

z docs
z ds


分别跳转到/Project/Warnest/docs/~/Dropbox/Projects/ds/test/。 z的参数是正则表达式,因此您甚至不需要键入完整的文件夹名称。

#22 楼

更新(2016):我现在使用FASD进行此操作,它允许基于您的最新目录进行模糊搜索。


我已经在Ruby中为此创建了一个工具。它允许您使用YAML文件来声明您的项目。

我在这里写了一篇关于它的小文章:
http://jrnv.nl/switching-projects-terminal-quickly /

我也在GitHub上发布了源代码:
https://github.com/jeroenvisser101/project-switcher

#23 楼

尝试https://pypi.org/project/fastcd/
它设置了钩子,用于记录bash中访问过的目录。并将脚本设置为“ j”别名,该脚本向您显示上次访问的目录,并具有快速cd(开始键入以过滤目录)的功能。

评论


这是如何运作的?如果是别名,此工具对您有什么作用,您无法通过手动编辑.bashrc来做什么?

– G-Man说“恢复莫妮卡”
2014年11月3日22:55

它启动守护程序,该守护程序在〜/ .fastcd中记录已启动的shell(bash)的访问目录。 “ j”启动工具,该工具向您显示上次访问的目录,并具有快速cd的功能。需要对.bashrc进行修改才能使用“ j”别名。我想您可以查看源代码以获取更多信息。

– Sam Toliman
2014年11月3日23:36

谢谢你快速的回复。这就是答案中应该包含的信息。请修改您的答案以包含此信息。

– G-Man说“恢复莫妮卡”
2014年11月4日15:21

#24 楼

TL; DR


Fish用于交互式外壳,可立即为您提供功能(fish> zsh> bash)。
使用POSIX / Bash进行脚本编写,这是最广泛支持的语法(POSIX> Bash> Zsh> Fish)。

Shells

这里测试了不同的Shell我的反馈(按照测试/采用的顺序):



Bash


自动完成:基本;
路径扩展:否;
脚本编制:出色。



Zsh + oh-my-zsh


自动完成:好(循环通过);
路径扩展:是(cd /e/x1cd /etc/X11/);
脚本编写:好。



Fish + oh-my-fish(当前)是最好的开箱即用:


自动完成:本机和受支持的选项;
路径扩展:是;
脚本编写:与POSIX-的差异太大兼容。



使用有意义的别名

每个外壳都可以使用functionalias进行扩展,这是我使用的与您的问题有关的(兼容POSIX):

back () {  # go to previous visited directory
        cd - || exit
}

up () {  # go to parent directory
        cd ..|| exit
}


有一些基本但很有意义的内容,因此易于记住和自动完成。

了解您的shell

配置CDPATH以添加最常用的目录(例如~/projects//etc/init.d/),因此您可以快速跳转到它们。

有关CDPATH上mroe的详细信息,请参阅manatwork答案。



我的自定义内容位于github:posix(bash / zsh),fish(接受PR);
可能有用的各种实用程序:tree,k(zsh的目录列表)

进入点为您的Shell查找插件:



bucaran / awesome-fish,

unixorn / awesome-zsh-plugins,
alebcay / awesome-shell



bashFAQ;

鱼类文档;
对于外壳之间的差异,我建议进行出色的hyperpolyglot.org/unix-shells比较。
在其IRC上:#bash,#zsh,#ohmyzsh,#fish等。我需要耐心等待年轻的帕达万)。


评论


当shell函数调用exit时,您退出交互式shell。那些“有意义的别名”可以只是别名back ='cd-'和别名up ='cd ..'-但请放心,这些命令将永远不会返回false(没有先前的目录?它将您发送回首页! (这是无操作!),因此您将永远不会退出。还要考虑别名back ='cd $ OLDPWD'(注意单引号),因为它没有任何输出(cd-告诉您它向您发送的位置,这可能是不必要的,因为您的提示中包含该信息)

–亚当·卡兹(Adam Katz)
19年3月7日在16:03



#25 楼

多年来,我一直在使用自己的实用程序cdhist来管理它。它是cd命令的别名,并自动保留目录堆栈。

#26 楼

您可以使用export将目录路径分配给变量,然后引用它们。

export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2


评论


是的,这足以满足一些最喜欢的顾客。无需安装任何其他实用程序。只需将export语句放在〜/ .bashrc中,它们将始终可用。

– Wisbucky
18年5月21日在21:44

#27 楼

这里有一些建议:

最直接的主意,我将在.profile文件中添加别名



vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'


然后使用$ dir1dir2,如果您始终只切换两个目录,则可以cd

。使用cd -将在它们之间切换。

#28 楼

我用于这种情况的解决方案是screen。开始屏幕,并使用C-a c为每个目录创建一个窗口,然后浏览至该目录。使用C-a nC-a p在Windows /目录之间切换。用C-a A命名窗口。然后,您可以使用C-a "弹出窗口列表,并使用窗口编号或窗口名称导航。由于它是screen,因此您可以从会话中分离出来,以节省您的工作空间,并稍后使用相同的设置重新连接。

#29 楼

看来您基本上需要的是工作流程的项目文件。使用属于您的活动的目录,例如在编程IDE中。尝试使用Zsh导航工具和那里的工具n-cd。它将允许您在上次访问的文件夹中导航,还可以定义带有所选目录的Hotlist



n-cd可以与以下按键组合:


zle -N znt-cd-widget

bindkey“ ^ T” znt-cd-widget


#30 楼

anc是cmd线工具(锚点的缩写),用于保留目录的书签。 (到目前为止,仅使用bash进行了测试)

在您的情况下:

anc a /Project/Warnest/docs/ ~/Dropbox/Projects/ds/test/


这会将两个目录都添加到锚(认为书签)列表中

现在,是否要从系统上的任何地方跳转到/Project/Warnest/docs/


anc Warn


,如果要跳转到~/Dropbox/Projects/ds/test/类型:

anc ds test


除了将文本与书签路径匹配之外,anc还具有许多其他方便的方法来跳转目录。

anc i


启动交互模式,该模式按数字列出所有书签,
因此您只需要输入数字

如果输入:

anc Pro[TAB]


显示与所有书签(在您的情况下为两个书签)匹配的列表,您可以使用箭头键从中进行选择,这是一种非常快速而直观的方法。 />
在项目的github页面上获取anc:
https://github.com/tobimensch/anc

还有一个自述文件,其中包含示例用法。

完整披露:我是该脚本的作者。我希望有人会觉得有用。