如何通过CLI快速进出深层嵌套目录?

我们知道使用cd 会打开目录,如果存在的话!

此外, cd ..将从当前工作目录中提升一级。

但是,当我们有一个像/home/thina/teams/td/tech/app/release/apks这样的更长路径的嵌套目录时,只是进入文件夹apks并且很难回到另一个节点很累,在这里说/home/thina/teams

有没有办法跳过cdcd ..的输入cd .. ? 我正在使用Ubuntu 16.04。

pushdpopd

 pushd /home/thina/teams/td/tech/app/release/apks # current directory now /home/thina/teams/td/tech/app/release/apks popd # current directory now what it was before pushd command 

尝试help pushdhelp popd获得更多选项。 没有man页,因为pushdpopd是bash内置命令。

除了已经提供的非常好的答案之外,以下是有效使用cd一些提示。

  • cd -将带您回到您所在的最后一个目录。
  • cd ../../..将同时带你3级,你可以使用链接在一起的..符号来“向上移动”任意多个目录。
  • 如果您不确定要向上移动多少次,请使用cd .. ,然后按向上箭头键再次使用该命令来使用bash历史记录。
  • 使用~代表当前用户的主目录,如果你以用户thina登录, cd ~/teams ,将带你到/home/thina/teams
  • 对路径使用Bash自动完成,tab键将在cd命令中完成路径的一部分,如果键入路径段的一部分后跟Tab ,那么如果没有其他有效选择,则该段将完成。 例如,如果您输入了cd /home/thina/teams/td/t然后按Tab键 ,那么就会填写tech这个词,只要td目录中没有其他文件或目录以信件

一起使用这些技巧可以使遍历cd目录更加痛苦。

要一次在树中上升几个级别,您可以使用以下function(感谢muru的增强版):

 up () { local old="$PWD" for i in $(seq "${1:-1}"); do cd .. done OLDPWD="$old" } 

然后你可以这样做:

 $ pwd /home/thina/teams/td/tech/app/release/apks $ up 5 cd'ing into /home/thina/teams 

另外:

  • 没有参数调用等同于cd ..由于${1:-1}在设置时替换$1 ,否则$1
  • 在最后一个cd ..之后设置OLDPWD cd ..旨在保留通常的cd -行为。

对于长目录名,请使用具有完整路径的变量。 例如,

 APKS="/home/thina/teams/td/tech/app/release/apks" 

然后你可以做cd "$APKS"

至于上升x个目录,我在.bashrc定义了这个函数

 goup() # go up x number of dirs { num=$1 while [ $num -ne 0 ];do cd .. num=$( expr $num - 1 ) done } 

要从/home/thina/teams返回/home/thina/teams ,你会这样做

 goup 6 

这是一个用法示例:

 $> pwd /sys/class/backlight/intel_backlight $> goup 3 $> pwd /sys $> 

我提出的另一个小function,但从未使用过的bookmarkfunction。

以下是它的工作原理:它将您当前的文件夹保存到某个文件,然后您可以根据该文件中的行号cd到特定目录。 例:

 $> cd /etc/lightdm $> bookmark $> cat ~/.dirsbookmarks /home/xieerqi /sys/class/backlight /etc/lightdm $> cd $( awk 'NR==2' ~/.dirsbookmarks ) $> pwd /sys/class/backlight 

这是函数本身:

 bookmark() { # bookmarks current dir pwd >> $HOME/.dirsbookmarks } 

更新:有一个比autojump更强大的工具: fasd ,但我不熟悉它。


我很惊讶没有人提到过autojump

通过维护命令行中使用最多的目录的数据库来工作(必须首先访问目录才能跳转到目录。)

它基本上是@graipher构建的,有一些额外的选项。

正如我在另一个问题上提到的那样 :

cd几次到一个目录(甚至一次足够):

cd /home/thina/teams/td/tech/app/release/apks

您可以使用快捷方式j快速移动到那里,无论您当前在哪个目录中:

j apks

请注意,使用路径的任何部分都可以工作,只要它在列表中最高: j app也会带你去.../apks如果你去那里的时间多于.../app

我推荐它而不是拥有自己的脚本,因为它维护得很好,为Ubuntu分发,并且还有其他简洁的function,例如跳转到子代

 .../td/tech $ jc apk .../release/apks $ 

已经把你apkstd ,而不是在另一apks下的其他apks

别名

我有一个通过别名直接可用的常用目录列表。 这还包括层次结构上的目录的快捷方式。

 alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias .....='cd ../../../..' alias cdwork=/home/knub/Repositories/work alias cduni=/home/knub/University 

现在,当我想要升级三级时,我只需输入....我就在那里!

打开autocd选项 ( shopt -s autocd ),这样就不必输入cd 。 例如,您只需要两个字符的命令..转到父目录。

如果您在两个目录之间导航,可以使用cd -在它们之间切换,这将转到上一个工作目录。 autocd选项不会-运行cd -但您可以为其定义别名或函数。

您可以使用builtins pushdpopd记忆堆栈中的目录。 内置dirs列出了目录堆栈(我发现dirs -v更具可读性)。

如果经常更改为特定目录的子目录,并且这些子目录具有相当唯一的名称,请将它们添加到CDPATH变量中。 但是请注意,我从未发现CDPATH实际上很方便的情况。

您可以将变量设置为目录名称,然后使用$foo更改$foo目录名称。

岩组 安装zsh 有一些很好的function,bash没有。 其中一些可以通过编写执行相同工作的函数来模拟。 特别是cd的双参数forms允许您方便地更改为具有相似名称的另一个目录,例如来自/home/thina/teams/td/tech/app/release/apks/com.acme/v1 ,运行cd release beta转到/home/thina/teams/td/tech/app/beta/apks/com.acme/v1

正如我已经回答过关于UnixSE的相关问题,我使用了一个名为z [github]的脚本。

它会记住您cd到的目录,根据frecency(频率+新近度)对它们进行排名,并允许您使用其名称的某些部分更改为其中一个记住的路径。

在cd至目录后至少一次你可以做,例如而不是:

 $ cd ~user/very/long/path/with/many/subfolders/ 

做就是了:

 $ z sub 

这将使用部分名称匹配(假设您的路径中没有其他目录包含术语sub和具有更高的frecency)。

我还定义了一个这样的函数,它首先尝试普通的cd,如果失败则使用z:

 function cd() { builtin cd "$1" 2> /dev/null || z "$1" || (echo "cd: File or Directory not found: $1" >&2 && exit 1) } 

这给你两者中最好的。 如果文件夹在当前目录中或者给出了有效的完整路径,它将只在那里cd,但如果没有,它将尝试在数据库中找到匹配并在那里cd。 这消除了有时必须使用cd(训练数据库,转到你以前从未去过的文件夹)的(小)痛苦,并且有时记得使用z。

我发现还有三个选项可以很好地工作(虽然我将来可能会使用pushd更多,我只是刚刚了解到这一点):

  • 安排你的路径,这样你就不需要首先进入深度嵌套的目录,或者更确切地说:所以你需要经常访问的位置就在你的指尖。 实现这一目标的方法是使用符号链接 :保持显式的,层次较好的目录,但为了方便起见,建立一个快速访问链接。

     ln -s ~/teams/td/tech/app/release/apks ~/apks 

    然后,不要输入cd的长路径,而是使用cd ~/apkscd ../teams (或者,在那个例子中, cd ../teams~/teams )来取回。

  • 不要在路径之间来回使用单个shell和cd,而是为每个需要工作的路径保持一个shell运行。有多个级别可以实现这种多任务处理:

    • 使用多个终端窗口。 如果窗口位于不同的工作区,则效果最佳。
    • 在单个窗口中使用多个选项卡。 这特别适合仅在某些目录中执行一些命令:要返回,只需关闭终端选项卡即可!
    • (不是真正明智的IMO,但为了完整性:)使用像tmux这样的终端多路复用器。
    • 只需在一个单一用途的命令中启动一个操作,然后将cd放入文件夹,在那里执行一项操作并立即对原始文件夹进行控制:而不是

       $ cd /home/thina/teams/td/tech/app/release/apks $ some_command this_file_here $ cd ../../../../.. 

      简单地做一个class轮

       $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here) 

      或者等价的

       $ sh -c 'cd ~/teams/td/tech/app/release/apks > some_command this_file_here' 
  • 根本不要cd ,只需直接从主目录执行命令即可。 支撑扩展在这里可以提供很多帮助:而不是

     $ cd /home/thina/teams/td/tech/app/release/apks $ some_command this_file_here other_file_also_apks $ cd ../../../../.. 

    你可以做

     $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks} 

Pushd和Popd

pushdpopd是我的最爱。 pushd命令将记住您访问过的目录,可以使用命令dirs查看,当您准备好向后跳转时,使用popd返回。

这是使用bash函数和别名的示例:

 sd () { pushd "$1" > /dev/null } po () { popd } alias d='dirs' 

我经常以各种方式混合使用这些命令。

别名

频繁访问目录的另一个选项是简单地为cdpushd命令添加别名。 所以,使用post中的示例:

 alias cdapks='cd /home/thina/teams/td/tech/app/release/apks' alias cdteams='cd /home/thina/teams' 

组合

结合这两个想法,你甚至可以这样:

 alias sdapks='sd /home/thina/teams/td/tech/app/release/apks' alias sdteams='sd /home/thina/teams' 

这样就可以在遍历目录时提供很大的灵活性。 我保留了cd***sd***别名,用于DesktopDocumentsMusicDownloads等等,它非常方便!

鱼有几个很好的设施,可以快速移动。

  • 如果输入cd right-arrow enter,它会重复最近的cd。
  • 通过使用cd向上箭头右箭头输入,它重复第二个最新的CD。
  • 等等。
  • 它已经上传和下一个,它通常比pushd和popd更容易使用。

另外,我把我最喜欢的目录符号链接到〜/ f,所以我可以cd~ / f / x来到〜/ foo / bar / baz / experimental-data。