等价于符号链接的别名?


18

我发现自己需要经常在我的主文件夹中跳转几个目录,并且厌倦了编写它们。我想要一种更快的方法,该方法传统上是一个符号链接。

但是,我不想用几十个符号链接弄乱我的主目录。我可以创建一些~/links/目录,用符号链接将其弄乱,但这仍然很丑陋。此外,我可能想创建符号链接,这些符号链接每天都会更改(在.bashrc中定义),以跳转到现今目录。

有没有一种方法可以有效地别名化符号链接,从而创建一些将被识别为快速导航的链接,但是在我执行ls主目录时实际上不会出现,并且不会持续到当前会话之外?


4
你可能想看看pushd和popd的
锐˚F里贝罗

我发现Jeroen Janssen的方法适应性强且成本低廉,可以满足
Theophrastus

2
您正在使用什么外壳?
吉尔斯(Gilles)“所以,别再邪恶了”

@Theophrastus嘿-基本上,这是我在回答中不太优雅地实现的。
mattdm

3
并非完全符合您的要求,但是在两个Directoris之间来回跳转时可能仍然会派上用场:cd -cd进入先前的目录。因此,如果您执行两次,则将返回到开始的位置...非常适合这种情况:“哦,我忘了在先前的位置编辑someFile.txt” =>简单:cd -编辑editFile.txtcd -
dingalapadum

Answers:


12

您可以使用制表符补全。在许多Linux发行版中,默认情况下会设置bash,以便在您按下[TAB]键时,会列出可能的匹配项,或者如果只有一个匹配项,则会全部填写。对于cd,这通常是当前工作目录的子目录列表。您可以覆盖它,但是我建议改用别名,例如jd“ jump directory”:

alias jd=cd

然后,将所需的“书签”定义为jd的补全。查看bash手册页上的更多选项(包括从命令或函数中即时生成结果),但是最简单的方法是使用单词列表-W

完成-W“ / srv / www〜/ tmp〜/ work” jd

现在,键入jd并点击[TAB],您将看到您的“书签”。键入任何不明确的部分,然后按[TAB]完成。(在上面,~s扩展到我的主目录,因此第一个[TAB]给我一个/,如果w再次点击和[TAB],/srv/www则被填写。)

当然,请放进~/.bash_profile去使其持久。

或者,我们可以将其提升到一个新的水平。创建一个目录~/.shortcuts-从一个点开始,它将被隐藏并且不会弄乱您的干净主目录-并在其中添加指向所需目录的符号链接。然后,将放在您的〜/ .bash_profile中:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

这在_list_shortcuts构建名称列表的功能中定义了稍微复杂一些的完成,并使其jd成为函数而不是简单的别名,因为我们希望它的行为不同于just cd。该-P检举cd使得解决符号链接,让一切都变得透明的魔法。您的快捷方式名称甚至不必匹配目标。

所以:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

并且,为了花哨的花哨,jd在执行时不带任何参数的情况下列出所有快捷方式:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

注意:我使用compgen -W $( cmd )而不是compgen -C 'cmd'因为后者永远不会对我有用,我也不明白为什么。这可能是我自己的新问题。:)


很有意思。不过,有一个陷阱,在我可以使用jd完成之前,它仍然需要键入完整的链接,或者至少键入足够的链接才能变得清晰。有什么方法可以将别名添加到jd命令中以缩短别名?或使它们相对于我可以存储符号链接的目录。
dsollen

@dsollen请参阅更新:)
mattdm

这很好。老实说,我没想到这个问题会有很好的答案,但这几乎正是我想要的。我预计会大量使用它,并且感觉很干净,可以在获得新VM时将其添加到我要修改的事物列表中(我什至拥有一种将标准环境更改克隆到新​​vm lol的自动方法)。非常感谢。在某个时候,当我有更多空闲时间时,我会弄清楚COMPREPLY的语法是如何工作的;)
dsollen 2015年

18

Shell别名具有您可以对它们进行(某些)名称完成(通常绑定到tab)的功能。或者,您可以使用此CDPATH功能,该功能“最近”(在过去5-6年内)已得到改进,以支持名称完成。如果这对您有效,则具有的优点是您键入的内容是目录的实际名称,而不是其助记符。

根据bash手册

CDPATH
用冒号分隔的目录列表,用作cd内置命令的搜索路径。

进一步阅读:


不知道CDPATH环境变量,谢谢。我可能会将git_repos目录添加到该变量
通配符

16

对于您经常访问但不每天更改的目录,另一种选择是alias.bashrc文件中包含几个命令:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

一个朋友大约有50个朋友。我有几个;快捷方便。只是

cdo

将目录更改为/ u01 / app / oracle


确实。自1990年代初以来,我一直使用这种机制。
wallyk

7

我推荐pushdpopd

在进行开发工作/读取源代码以及涉及多个目录时,我个人确实觉得它们很方便。

它们有效地实现了堆栈结构/ LIFO,您可以在其中推目录(pushd),然后下一个POP目录命令(popd)检索它。

因此,在目录中时,您将执行以下操作:

pushd .

当您需要检索它时,您可以

popd

您可以执行多个操作pushd,以后再执行相应popd操作,以返回目录。

我会在这里留下一个链接。

http://www.eriwen.com/bash/pushd-and-popd/


1
这也是我使用的解决方案,除了我用的popd不多。我用这段时间要访问/工作的所有目录dirs填充列表(由pushd命令填充),然后运行pushd +1。然后,通过一个简单的目录,我可以循环!pu这是非常快的。(请注意,在Ubuntu和CentOS上,这pushd都是以。开头的全新安装中唯一可用的命令pu。)
通配符2015年

3

您可以将它们作为变量放入您的中~/.bashrc,然后它们就$消失了。

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

显而易见的答案是变量,外壳程序中那些代表其他内容的符号事物,类似于文件系统中的符号链接。

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

在任何体面的shell中,您都可以Tab完成变量名的填写,这将进一步有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.