情景

通常情况下,在linux系统上切换目录的成本很低,使用cd命令就可以了。如果需要在一个目录的不同的子目录和其父目录之间切换,进入到这个目录之后,再使用相对路径会比较方便。如果要切换的目录的路径较浅,那使用绝对路径也未尝不可。

但是,如果需要频繁在两个以上的深路径的目录里切换,无论使用相对路径还是绝对路径,切换目录都会比较耗时,严重影响你工作的效率。

有没有什么好方法呢?

方案

为了方便举例,我们在当前用户的根目录下创建一个目录dir_test,然后进入到该目录下。

$ pwd
/home/j-tester/dir_test

再在这个目录下创建几个路径较深的目录:

$ mkdir -p 1/11/111/1111/11111 2/22/222/2222/22222 3/33/333/3333/33333 4/44/444/4444/44444

为了方便演示和说明,故意将每个目录的名称都设置为数字,且根据层次依次增加数字的位数。实际情景下遇到的长路径无论是目录名称的长度还是每层目录下的子目录数量都比本例要复杂得多的。

查看一下这些个目录:

$ ls -l */*/*/*/*
1/11/111/1111/11111:
总用量 0 2/22/222/2222/22222:
总用量 0 3/33/333/3333/33333:
总用量 0 4/44/444/4444/44444:
总用量 0

两个目录

如果只需要在两个目录之间切换,无论目录的路径长短,使用cd -(切换到上一个目录)应该是最高效的。

比如,只需要在1111133333两个目录之间切换:

先进入11111目录,再进入33333目录,此时执行cd -就进入了11111目录。再执行cd -就又回到了33333目录,如此反复。并且cd -执行后会输出当前所在的目录。

$ cd /home/j-tester/dir_test/1/11/111/1111/11111
$ pwd
/home/j-tester/dir_test/1/11/111/1111/11111
$ cd /home/j-tester/dir_test/3/33/333/3333/33333
$ pwd
/home/j-tester/dir_test/3/33/333/3333/33333
$ cd -
~/dir_test/1/11/111/1111/11111
$ cd -
~/dir_test/3/33/333/3333/33333
$ cd -
~/dir_test/1/11/111/1111/11111

是不是很方便?但务必注意,它只能记住上一个目录是什么,所以如果在两个目录之间切换它刚好适用。当需要在更多的目录里切换时,它就Hold不住了。

软链接

linux系统下可以创建软链接,相当于windows下的快捷方式。

使用软链接的方式可以从一定程度上降低切换目录的成本,但也有着明显的缺点:

  1. 如果实现n个目录的自由切换,需要创建n*(n-1)个软链接,这样看来,似乎仅当n=2时工作量还可以接受;
  2. 切换别的目录时,还需要重新创建软链接;
  3. 创建软链接毕竟需要对目录内容进行了改变,这往往不是预期的效果;

所以,介绍软链接用于切换目录只是提供一种思路而已。

目录栈命令

但凡是切换目录的场景,目录栈命令都hold住

目录栈命令共有三个:pushd、popd、dirs。

要想熟练使用这三个命令,首先要理解什么是目录栈。

目录栈

目录栈是用户最近访问过的系统目录的列表(和环境变量DIRSTACK内容相对应),并以堆栈的形式管理,列表中的每一项都是绝对路径

dirs

dirs命令的结果显示当前目录栈中的所有记录。默认情况下的目录栈是当前目录。

dirs
~
cd dir_test
dirs
~/dir_test ~

进入到dir_test目录后执行dirs,结果首先是当前目录,其次是进入dir_test之前的目录栈内容。这说明了,cd dir_test的操作是除了进入目录之外,还将dir_test这个目录加入到了目录栈中。目录栈的最左端是栈顶,最右端是栈底。

用法:

dirs [+N] [-N] [-cplv]

参数说明:

+N   将第N个目录显示出来(从左边栈顶数起,数字从0开始)
-N 将第N个目录显示出来(从右边栈底数起,数字从0开始)
-c 删除目录栈中的所有记录
-l 以完整格式显示(默认情况下当前用户的根路径用~表示)
-p 每行一个目录来显示目录栈的内容
-v 每行一个目录来显示目录栈的内容,每个目录前加上的编号,从0开始

pushd

pushd的作用是将目录加入到目录栈的顶部,并切换到该目录。

不带参数执行时,效果是互换目录栈顶部的前两个目录的位置,也就实现了在栈顶的最上面两个目录之间切换。

用法:

pushd [-n] [+N] [-N]
pushd [-n] [dir]

参数说明:

-n   将目录入栈时,不切换目录
+N 将第N个目录移至栈顶(从左边栈顶数起,数字从0开始)
-N 将第N个目录移至栈顶(从右边栈底数起,数字从0开始)

popd

popd的用途是删除目录栈中的记录。

不带参数执行时将删除目录栈顶部的目录,然后切换到新的栈顶元素所指向的目录。

用法:

 popd [-n] [+N] [-N]

参数说明:

+N   将第N个目录删除(从左边栈顶数起,数字从0开始)
-N 将第N个目录删除(从右边栈底数起,数字从0开始)
-n 将目录出栈时,不切换目录

三个命令都有+N和-N的参数,且规则一致,为了避免混淆,记住一个方向即可:

自顶(栈顶、左边)向下(栈底、右边)是正道(正号、+N)

创建别名

实际使用时还可以为pushd和popd设置别名,比如:

alias p1="pushd +1"
alias p2="pushd +2"
alias pp1="popd +1"
alias pp2="popd +2"

可根据自己的实际需求定制。

目录栈命令用起来非常灵活,也非常便利。

扩展知识

  1. 快捷目录-
  2. 软链接
  3. 目录栈及命令

情景linux--如何摆脱深路径的频繁切换烦恼?的更多相关文章

  1. Linux查看软件安装路径

    Linux中查看某 个软件的安装路径(地址)有时显得非常重要.比如某个文件的快速启动项被删除,或者你要建立快速启动项,或者想删除. 添加安装文件等等,很多地方都要用到查案文件安装路径的命令. 这里给大 ...

  2. Linux下multipath多路径配置

    一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存 储通过了光纤交换机或者多块网卡及IP ...

  3. [ Linux运维学习 ] 路径及实战项目合集

    我们知道运维工程师(Operations)最基本的职责就是负责服务的稳定性并确保整个服务的高可用性,同时不断优化系统架构.提升部署效率.优化资源利用率,确保服务可以7*24H不间断地为用户提供服务. ...

  4. linux之 multipath 多路径

    一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来 ...

  5. 再思linux内核在中断路径内不能睡眠/调度的原因(2010)【转】

    转自:http://blog.csdn.net/maray/article/details/5770889 Linux内核中断路径中不能睡眠,为什么? 这里就行了很深入的讨论,值得一看:http:// ...

  6. linux下添加动态链接库路径、动态库加载等方法

    linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596   Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...

  7. linux添加头文件路径

    gcc demo.c -o demo  -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...

  8. 进程上下文频繁切换导致load average过高

    一.问题现象 现网有两台虚拟机主机95%的cpu处于idle状态,内存使用率也不是特别高,而主机的load average达到了40多. 二.问题分析 先在主机上通过top.free.ps.iosta ...

  9. [转帖]进程上下文频繁切换导致load average过高

    进程上下文频繁切换导致load average过高 2016年6月26日admin发表评论阅读评论 http://www.361way.com/linux-context-switch/5131.ht ...

随机推荐

  1. ImmutableMap

    不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...

  2. web技术发展历程--读《大型网站技术架构_核心原理与案例分析》

    1 早期的web服务 2 CGI程序的出现.发展.凋零到MVC的兴起 CGI:通用网关接口技术. 随着CGI技术的出现,web服务端可以通过不同的用户请求产生动态页面内容. web服务器将请求数据交给 ...

  3. CURL post/get提交

    public function curlss($url){ $curl = curl_init(); // 设置你需要抓取的URL curl_setopt($curl, CURLOPT_URL, $u ...

  4. 各模拟器adb连接端口

    如果执行自动化测试,在没有真机的情况下,我们唯一的选择便是模拟器.目前市面上有很多模拟器,他们使用adb连接时都会有不同的默认接口,当adb无法自动连接模拟器时,手动使用ip+端口连接是很好的选择.下 ...

  5. python脚本检查TCP端口是否正常

    #!/usr/bin/python import socket import re import sys def check_server(address,port): s = socket.sock ...

  6. SDP(5):ScalikeJDBC- JDBC-Engine:Streaming

    作为一种通用的数据库编程引擎,用Streaming来应对海量数据的处理是必备功能.同样,我们还是通过一种Context传递产生流的要求.因为StreamingContext比较简单,而且还涉及到数据抽 ...

  7. 2018-01-08 学习随笔 SpirngBoot整合Mybatis进行主从数据库的动态切换,以及一些数据库层面和分布式事物的解决方案

    先大概介绍一下主从数据库是什么?其实就是两个或N个数据库,一个或几个主负责写(当然也可以读),另一个或几个从只负责读.从数据库要记录主数据库的具体url以及BigLOG(二进制日志文件)的参数.原理就 ...

  8. Job 失败了怎么办?- 每天5分钟玩转 Docker 容器技术(133)

    上一节讨论了 Job 执行成功的情况,如果失败了会怎么样呢? 修改 myjob.yml,故意引入一个错误: 先删除之前的 Job: 如果将 restartPolicy 设置为 OnFailure 会怎 ...

  9. pandas读取各类sql数据源

    大数据分析中,我们经常需要使用pandas工具读取各类数据源并将结果保存到数据库中. 本文总结了一些读取和写入常用数据库数据的一些方法,包括mysql,oracle,impala等. 其中读取数据库数 ...

  10. 940B Our Tanya is Crying Out Loud

    传送门 题目大意 给你n,k,A,B四个数,x=n,有两种操作: 1.将x-1,需支付A个金币 2.将x÷k,需支付B个金币,当且仅当k能整除x时可进行此操作 问将x修改为1至少要花几个金币 分析 模 ...