情景

通常情况下,在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 -(切换到上一个目录)应该是最高效的。

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

先进入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下的快捷方式。

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

如果实现n个目录的自由切换,需要创建n*(n-1)个软链接,这样看来,似乎仅当n=2时工作量还可以接受;

切换别的目录时,还需要重新创建软链接;

创建软链接毕竟需要对目录内容进行了改变,这往往不是预期的效果;

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

目录栈命令

但凡是切换目录的场景,目录栈命令都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"

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

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

扩展知识

快捷目录-

软链接

目录栈及命令

linux环境变量堆栈,情景linux--如何摆脱深路径的频繁切换烦恼?相关推荐

  1. linux 环境变量详解,Linux 环境变量详解及实例

    Linux环境变量 ~/.bash_profile && ~/.bashrc 用户登陆Linux操作系统的时候,"/etc/profile", "~/.b ...

  2. linux环境变量设置方法,Linux环境变量设置指南

    以配置java环境变量为例 [编辑]修改/etc/profile文件 此法对所有用户生效 在文件末尾加入以下内容: JAVA_HOME=/usr/share/jdk1.5.0_05 PATH=$JAV ...

  3. linux环境变量设置图解,Linux环境变量设置

    一.环境变量的概念 1.环境变量的含义 程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的. 2.环境变量的分类 1)按生效的范围分类. 系统环境变量:公共的,对全部的 ...

  4. linux环境变量设置 profile,Linux 环境变量 设置 etc profile

    一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要修改配置文件,变量永久生效. 2.临时的:使用export命令声明即可,变量在关闭shell时失效. 二. ...

  5. linux环境变量自动配置,Linux进入系统时自动配置 环境变量的要领

    用Exp ort命令能够 配置 环境变量,但是假如 每回进入系统之后都要重新配置 一遍环境变量就很烦人.Linux给大众 提供了自动配置 环境变量的要领 ,那就是修改 .bashrc 文件. 通常 说 ...

  6. linux 环境变量详解,linux环境变量实例详解

    1.环境变量 简单理解了变量的概念,就很容易理解环境变量了.环境变量的作用域比自定义变量的要大,如 Shell 的环境变量作用于自身和它的子进程.在所有的 UNIX 和类 UNIX 系统中,每个进程都 ...

  7. linux环境变量命名规范,Linux就该这么学 -- 重要的环境变量

    变量是计算机系统用于保存可变值的数据类型. 在Linux中,变量名一般都是大写,这是一种约定俗成的规范,我们可以直接通过变量名称来提取到对应的变量值. 用户执行一条命令,Linux系统一般分为4个步骤 ...

  8. linux环境变量权限不够,linux环境变量及权限的理解

    计算机的五大单元--------------------------------------- 注 :存储器->内存 CPU不能直接与外设接触:从内存中读取数据,完成处理先写回内存,数据再从内存 ...

  9. linux 环境变量 哪个文件,Linux环境变量配置文件

    环境变量配置文件 如想将一个路径加入到$PATH中,可以像下面这样做: 1. 控制台中: $ PATH="$PATH:/my_new_path"    (关闭shell,会还原PA ...

最新文章

  1. Redhat7 samba配置(部分)
  2. strnicmp,strncmpi方法
  3. 纪中2016.10.6比赛不明总结
  4. Silverlight Gantt甘特图项目管理解决方案
  5. python编辑器_资深程序员:学Python我推荐你用这几款编辑器
  6. 从本地文件系统迁移oracle数据库到ASM
  7. 服务器重置密码后无法启动不了怎么办,Windows Server 2008 R2 忘记密码的处理方法...
  8. Access Modify Change 三种时间戳详解
  9. Python2.7学习笔记-定义函数、filter/map/reduce/lambda
  10. (转)300家平台倒闭,BAT纷纷离场,到底什么模式已经全军覆没?
  11. Pr 电影中常见的回忆效果
  12. 安全测试工具APPScan下载安装及简单使用
  13. 谷歌方法 pdf txt azw3 epub mobi 百度云盘网盘下载
  14. 阿里通信携手联通MWC演示“智选加速” 预演5G垂直应用
  15. AI把英语系新生吓退学?别急,我们从来都是那只懒蚂蚁
  16. char[]和char* 输出长度不同
  17. Java 同步监视器中的 wait() 和 notify() 方法的具体实现
  18. 世界杯梦幻联动.html
  19. 黑客留下的网站后门,可以作什么?
  20. Rapid IO接口测试工装研究

热门文章

  1. 视频监控:特征识别真的优于人脸识别吗?
  2. poj——3177Redundant Paths
  3. Struts2+Hibernate+Spring 整合示例
  4. Android拖拽图片的实现
  5. 存储过程---角色权限叠加
  6. bufferedreader读取中文乱码_Python读取excel的两种方法
  7. 用switch写收水费的c语言程序,超级新手,用switch写了个计算器程序,求指导
  8. 计算机的主要硬件部件,主要内容: 计算机的基本概念 系统硬件组成(主要部件、系...的.ppt 文档全文预览...
  9. oracle创建数据库总结,oracle创建数据库和用户方法总结
  10. android textview图标左侧,Android 自定义 TextView drawableTop 图标与文字左对齐(效果图)...