Answers:
如果您只是在两个目录之间切换,可以使用cd -
来回切换。
有一个shell变量CDPATH
中bash
,并ksh
与cdpath
在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 docs
,cd test
将带您到第一个找到的目录。(我的意思是,即使当前目录中存在一个具有相同名称的目录,CDPATH
仍将对其进行查询。如果CDPATH
将包含具有给定名称的子目录的更多目录,则将使用第一个目录。)
$CDPATH
是.
(显式条目,即:
也可以)。否则,您将得到奇怪的行为,即CDPATH
目录优先于当前工作目录中的目录,而您可能不希望这样做。
cd
引用它。
您可能还会尝试使用一种称为autojump的工具。它保留了对其别名的调用数据库(j
默认情况下),并尝试就要去的地方做出明智的决定。例如,如果您经常键入:
j ~/Pictures
您可以使用以下方法轻松到达那里:
j Pic
它可Debian和Ubuntu,以及包含在每个用户的基础上的~/.bashrc
或~/.zshrc
默认。
cd -
知道您是否还很方便,但我认为这是比当前最佳答案更好的解决方案。
apt-get install autojump
在Ubuntu中,也可以用于其页面上的许多其他软件包)用于系统范围的安装,但是每个用户都需要将其加载到其shell环境中,以便可以覆盖cd来跟踪您要去的地方
source /usr/share/autojump/autojump.sh
应该添加到〜/ .bashrc中,以使自动跳转工作。
如果目录数量很少,则可以使用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="$1"
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 $1}')
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
等等。显然,这只是为了在堆栈中旋转,并且不处理添加新路径-也许我应该重命名它。
pushd
,并popd
用于遍历,但不是说PUSHD可以轮播什么到目前为止使用...
我alias
在bashrc中使用这些CD。
如:
alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
~/.bashrc
或/etc/bash.bashrc
。我以前没有使用.profile
过,所以不知道它们之间的关系:-(
.bash_profile
,它的工作很棒.. thx :)
我找到了一个脚本(通常称为acd_funch.sh)为我解决了此问题。有了它,您可以键入cd --
以查看所使用的最后10个目录。它看起来像这样:
0 ~/Documents/onedir
1 ~/Music/anotherdir
2 ~/Music/thirddir
3 ~/etc/etc
去~/Music/thirddir
只需键入cd -2
注意:此脚本最初发布在linux gazette文章中,该文章可在此处找到:acd_func.sh-扩展bash的CD以保留,显示和访问已访问目录名称的历史记录。
尝试使用cdable_vars
bash中的shell选项。您可以使用打开它shopt -s cdable_vars
。
然后,您需要设置变量export dir1=/some/path
。最后cd dir1
,等等。然后,您可以将其放入其中~/.bashrc
以使其粘住。
这里有很多好的建议。使用哪个取决于您是否有固定的目录切换列表,或者是否在寻找更通用的解决方案。
如果列表很小,那么设置简单的别名(如Felix Yan所建议)将最容易使用。
如果您正在寻找更通用的解决方案(即,许多不同的目录,随着时间的推移而变化),那么我将使用push和popd(如Useless建议)。我个人觉得默认的push / popd很难使用,尤其是当您开始在许多文件夹之间切换时;但是我写了一些调整,使我更轻松。将以下内容添加到您的bashrc中:
alias dirs='dirs -v'
pd ()
{
if [ "$1" ]; then
pushd "${1/#[0-9]*/+$1}";
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$
以下内容似乎适用于我测试过的一种情况,您可以在〜/ Bookmarks中将目录名称作为符号链接删除:
mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"
function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }
ccd testdir && echo $PWD
# gives /tmp
function
行进入您的.bashrc(您可以在终端中进行测试,但是当您关闭该窗口时该行将消失),设置“ testdir”测试用例之前的行将成为的名称/tmp
,并且最后一行是测试,看它是否有效。
我建议使用zsh,该外壳可以很好地完成目录,文件甚至大多数cli程序的选项的TAB完成。
我已经使用该shell多年了,如果它消失了,我会想念它的功能。编写zsh脚本也很有趣,因为有大量的单行代码可以每天为您提供帮助。
以我的经验,在shell中导航的最大加速是使用其历史搜索功能。在Bash中,您可以通过按Ctrl
+ R
并输入某种模式来向后搜索命令历史。然后,将该模式与历史记录中的先前条目进行匹配-可能是cd
命令或其他操作-并在您键入内容时提出建议。只需按Enter键即可再次运行建议的命令。这reverse-search-history
在Bash中被称为,我喜欢它。它为我节省了许多按键操作,并节省了内部内存。
这是一件好事,因为您只需要记住命令的一小部分,例如Drop
或Wa
区分两个历史记录条目cd ~/Dropbox/Projects/ds/test/
和cd /Project/Warnest/docs/
。
我还使用了这些别名(将它们添加到〜/ .bashrc中):
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
与它们一起进入上一级目录要快得多(不过它只能解决一半的导航问题)。
有一个相当不错的工具可以快速更改目录:
xd-eXtra快速目录 更改程序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
到位的command xd
-你总是可以运行command xd …
,如果你需要绕过它)。
无论如何,您永远都不应在shell中键入完整路径。您始终可以使用:
soffice /P*/W*/*/mydoc*
代替
soffice /Project/Warnest/docs/mydoc.odt
P*
除非Project是唯一一个以P开头的文件,否则您将无法做。制表符补全可以循环(默认情况下,在大多数Shell中;您需要将bb重新绑定到menu-complete
bash中),并在简单情况下立即解决像这样,没有等待的机会
/P*/W*/*/mydoc*
听起来好像还可以,直到有一天您碰巧制作了另一个与该glob相匹配的文件,突然间结束了一次打开两个。/u*/*/g++
几乎没有字符,但是希望我的任何根文件夹的子文件夹中的其他子都没有u
命名为g++
。(作为一个不错的折衷方案,在某些外壳中,您可以使用tab
还有一个专门为此目的创建的“ wcd”应用程序(也已经移植到cygwin上,因为我在使用它)。您可以使用它创建快捷方式,目录书签。还支持通配符。阅读/ usr / share / wcd中的手册页和文档应该会很有帮助。
cdargs是用于标记目录书签的最有效工具:http : //www.youtube.com/watch?v= uWB2FIQlzZg
sudo apt-get cdargs
在ubuntu上。顺便说一句,youtube视频确实很糟糕,但是该工具很棒。
试试fastcd(https://github.com/frazenshtein/fastcd)它设置钩子,记录从bash访问的目录。并将脚本设置为“ j”别名,该脚本向您显示上次访问的目录,并具有快速cd(开始键入以过滤目录)的功能。需要对.bashrc进行修改才能使用“ j”别名。
获取工具
cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd
安装所需的模块
pip install --user urwid
将set.sh文件来源到您的bashrc中
echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc
并更新bashrc
source ~/.bashrc
然后在控制台中输入“ j”
.bashrc
?
我有同样的问题,首先找到了这个答案。我安装了实用程序z(https://github.com/rupa/z)。
这正是您要寻找的,因为z从您的cd命令中学习,并根据频率原理(频率和最近)跟踪目录。因此,在一次执行两个cd命令之后,您可以执行以下操作:
z docs
z ds
分别跳到/Project/Warnest/docs/
和~/Dropbox/Projects/ds/test/
。z的参数是正则表达式,因此您甚至不需要键入完整的文件夹名称。
更新(2016):我现在使用FASD进行此操作,它允许基于您的最新目录进行模糊搜索。
我已经在Ruby中为此创建了一个工具。它允许您使用YAML文件来声明您的项目。
我在这里写了一篇关于它的小文章:http : //jrnv.nl/switching-projects-terminal-quickly/
我还在GitHub上发布了源代码:https : //github.com/jeroenvisser101/project-switcher
Fish
用于交互的shell立即使您(fish
> zsh
> bash
)。POSIX
/ Bash
编写脚本,这是最广泛支持的语法(POSIX
> Bash
> Zsh
> Fish
)。在这里测试了不同的外壳是我的反馈(按照测试/采用的顺序):
Bash
:
Zsh
+ oh-my-zsh
:
cd /e/x1
→ cd /etc/X11/
);Fish
+ oh-my-fish
(当前)是开箱即用的最佳选择:
可以使用function
和扩展每个shell alias
,以下是我使用的与您的问题相关的(兼容POSIX):
back () { # go to previous visited directory
cd - || exit
}
up () { # go to parent directory
cd ..|| exit
}
有一些基本但真正有意义的内容,因此易于记住和自动完成。
配置CDPATH
添加你最常用的目录(例如~/projects/
,/etc/init.d/
),这样你就可以快速跳转到它们。
有关更多信息,CDPATH
请参见manatwork答案。
exit
,您退出了交互式shell。这些“有意义的别名”可能仅仅是alias back='cd -'
和alias up='cd ..'
-但不要担心,这些命令将永远不会返回false,所以你永远不会退出(没有以前的目录发送您的家已经在根这是一个空操作?!?!) 。还请考虑alias back='cd $OLDPWD'
(请注意单引号),因为它没有任何输出(cd -
告诉您它将发送给您的位置,这可能是不必要的,因为您的提示中包含该信息)
anc
是cmd线工具(锚的缩写),用于保留目录的书签。(到目前为止仅通过bash测试)
在您的情况下:
anc a /Project/Warnest/docs/ ~/Dropbox/Projects/ds/test/
这将两个目录都添加到anchor(认为书签)列表中
现在,如果/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
还有一个有关示例用法的自述文件。
完全公开:我是该脚本的作者。我希望有人会发现它有用。