sai*_*y2k 128 command-line shell bash alias cd-command
我想经常在完全不相关的路径中的目录之间切换,例如/Project/Warnest/docs/和~/Dropbox/Projects/ds/test/。
但我不想一直打字cd /[full-path]/。是否有任何快捷命令可以切换到以前工作过的目录?
我能想到的一种解决方案是将环境变量添加到我bash .profile的常用目录中,cd并使用这些变量添加到它们中。
但是有没有其他解决办法呢?
Chr*_*ard 142
如果您只是在两个目录之间切换,则可以使用cd -来回切换。
man*_*ork 64
CDPATH在bashandksh和cdpathin 中有一个 shell 变量zsh:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
然后cd docs,cd test将带您到第一个找到的此类目录。(我的意思是,即使当前目录中存在同名目录,CDPATH仍然会被查询。如果CDPATH将包含更多具有给定名称的子目录的目录,将使用第一个。)
小智 52
您可以尝试的其他工具是名为autojump的工具。它保存了一个调用它的别名的数据库(j默认情况下),并尝试对你想去的地方做出明智的决定。例如,如果您经常键入:
j ~/Pictures
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法在紧要关头到达那里:
j Pic
Run Code Online (Sandbox Code Playgroud)
它可Debian和Ubuntu,以及包含在每个用户的基础上的~/.bashrc或~/.zshrc默认。
Use*_*ess 41
如果是少量目录,您可以使用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
Run Code Online (Sandbox Code Playgroud)
不同的是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
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
# 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
Run Code Online (Sandbox Code Playgroud)
等等。显然这只是为了在堆栈中旋转而不处理添加新路径 - 也许我应该重命名它。
Fel*_*Yan 19
我alias在 bashrc 中使用这些 CD。
如:
alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
Run Code Online (Sandbox Code Playgroud)
Eel*_*vex 14
使用“pushd -n ”(假设您使用 bash)。
添加到您的 ~/.bashrc:
pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/
Run Code Online (Sandbox Code Playgroud)
然后,
cd ~ 是你的家,
cd ~1 是 ~/Dropbox/Projects/ds/test/
cd ~2 是 /Project/Warnest/docs/
您可以使用~1,~2以完全相同的方式等~。
小智 12
我找到了一个脚本(通常称为 acd_fnch.sh)为我解决了这个问题。有了这个,您可以键入cd --以查看您使用的最后 10 个目录。它看起来像这样:
0 ~/Documents/onedir
1 ~/Music/anotherdir
2 ~/Music/thirddir
3 ~/etc/etc
Run Code Online (Sandbox Code Playgroud)
去~/Music/thirddir只是输入cd -2
注意:此脚本最初发布在 linux 公报文章中,可在此处获得:acd_func.sh -- 扩展 bash 的 CD 以保留、显示和访问访问目录名称的历史记录。
Woj*_*tek 11
cdable_vars在 bash 中尝试shell 选项。你用 开启它shopt -s cdable_vars。
然后你需要设置你的变量export dir1=/some/path。最后cd dir1,等等。然后你可以把它放在你的~/.bashrc里面让它粘住。
这里有很多很好的建议。使用哪个取决于您是否有一个小的固定目录列表,或者您是否正在寻找更通用的解决方案。
如果它是一个小的固定列表,设置简单的别名(如 Felix Yan 建议的那样)将是最容易使用的。
如果您正在寻找更通用的解决方案(即许多不同的目录,随时间变化),我会使用 pushd 和 popd(如 Useless 建议的那样)。我个人认为默认的 pushd/popd 很难使用,尤其是当您开始在许多文件夹之间切换时;但是我写了一些调整,让我更容易。将以下内容添加到您的 bashrc:
alias dirs='dirs -v'
pd ()
{
if [ -n "$1" ]; then
pushd "${1/#[0-9]*/+$1}";
else
pushd;
fi > /dev/null
}
Run Code Online (Sandbox Code Playgroud)
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$
Run Code Online (Sandbox Code Playgroud)
以下似乎适用于我对其进行测试的一种情况,您可以将目录名称作为符号链接放在 ~/Bookmarks 中:
mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"
function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }
ccd testdir && echo $PWD
# gives /tmp
Run Code Online (Sandbox Code Playgroud)
小智 6
根据我的经验,在 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 ../../../..'
Run Code Online (Sandbox Code Playgroud)
和他们一起去上层目录要快得多(但它只解决了一半的导航)。