如何通过CLI快速进出深层嵌套目录?
我们知道使用cd
会打开目录,如果存在的话!
此外, cd ..
将从当前工作目录中提升一级。
但是,当我们有一个像/home/thina/teams/td/tech/app/release/apks
这样的更长路径的嵌套目录时,只是进入文件夹apks
并且很难回到另一个节点很累,在这里说/home/thina/teams
。
有没有办法跳过cd
和cd ..
的输入cd ..
? 我正在使用Ubuntu 16.04。
有pushd
和popd
:
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 pushd
并help popd
获得更多选项。 没有man
页,因为pushd
和popd
是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 ..
之后设置OLDPWDcd ..
旨在保留通常的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,但从未使用过的bookmark
function。
以下是它的工作原理:它将您当前的文件夹保存到某个文件,然后您可以根据该文件中的行号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 $
已经把你apks
了td
,而不是在另一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 pushd
和popd
记忆堆栈中的目录。 内置dirs
列出了目录堆栈(我发现dirs -v
更具可读性)。
如果经常更改为特定目录的子目录,并且这些子目录具有相当唯一的名称,请将它们添加到CDPATH
变量中。 但是请注意,我从未发现CDPATH
实际上很方便的情况。
您可以将变量设置为目录名称,然后使用$foo
更改$foo
目录名称。
岩组 有一些很好的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 ~/apks
和cd ../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
pushd
和popd
是我的最爱。 pushd
命令将记住您访问过的目录,可以使用命令dirs
查看,当您准备好向后跳转时,使用popd
返回。
这是使用bash函数和别名的示例:
sd () { pushd "$1" > /dev/null } po () { popd } alias d='dirs'
我经常以各种方式混合使用这些命令。
别名
频繁访问目录的另一个选项是简单地为cd
或pushd
命令添加别名。 所以,使用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***
别名,用于Desktop
, Documents
, Music
, Downloads
等等,它非常方便!
鱼有几个很好的设施,可以快速移动。
- 如果输入cd right-arrow enter,它会重复最近的cd。
- 通过使用cd向上箭头右箭头输入,它重复第二个最新的CD。
- 等等。
- 它已经上传和下一个,它通常比pushd和popd更容易使用。
另外,我把我最喜欢的目录符号链接到〜/ f,所以我可以cd~ / f / x来到〜/ foo / bar / baz / experimental-data。