符号链接的等价物别名?

dso*_*len 18 cd-command symlink

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

但是,我不想用几十个符号链接弄乱我的主目录。我可以创建一些~/links/目录和杂波与符号链接,但它仍然是丑陋的。此外,我可能想创建每天都会改变的符号链接(在 .bashrc 中定义)以跳转到当前目录。

有没有办法有效地为符号链接设置别名,创建一些将被识别为快速导航链接的东西,但当我执行ls我的主目录时实际上不会出现,并且不会持续到当前会话之后?

Tho*_*key 18

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

根据bash手册

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

进一步阅读:


Mar*_*art 16

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

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 
Run Code Online (Sandbox Code Playgroud)

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

cdo
Run Code Online (Sandbox Code Playgroud)

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


mat*_*tdm 14

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

alias jd=cd
Run Code Online (Sandbox Code Playgroud)

然后,将您想要的“书签”定义为 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
Run Code Online (Sandbox Code Playgroud)

这在_list_shortcuts构建名称列表的函数中定义了一个稍微复杂一点的完成,并使jdbe 成为一个函数而不是一个简单的别名,因为我们希望它的行为与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
Run Code Online (Sandbox Code Playgroud)

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

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

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


Rui*_*iro 7

我推荐pushdpopd

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

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

所以,当在一个目录中时,你会这样做:

pushd .
Run Code Online (Sandbox Code Playgroud)

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

popd
Run Code Online (Sandbox Code Playgroud)

您可以执行多个pushd(s),并在popd稍后执行相应的(s),以返回目录。

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

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

  • 这也是我使用的解决方案,除了我不经常使用 `popd`。我用我想要访问/工作的所有目录填充我的`dirs`列表(由`pushd`命令填充),然后运行`pushd +1`。然后,我可以使用一个简单的 `!pu` 来循环浏览目录,它*非常*快。(请注意,在 Ubuntu 和 CentOS 上,`pushd` 是在以 `pu` 开头的全新安装中可用的*唯一*命令。) (2认同)