> Linux教程 > linux基础 >

浏览目录树

用于更改目录的 cd 命令是您学习的首批 UNIX® shell 命令之一,该命令的用途非常广泛。了解使您能够更轻松地快速浏览目录的一些快捷键。另外,了解如何更好地利用一些常用变量来使用 cd 命令。

即使您多年以来一直在使用 cd 命令,您也可能会对它的一些特性感到惊讶。究竟您最后一次运行 man cd 命令是在什么时候?(参见 参考资料,获取 cd 命令的文档链接。)cd 命令有几个小技巧,可以帮助您节约大量不必要的录入。考虑到您必须频繁更改目录,这对于您来说一定是个好消息。

本文检查 UNIX® 目录结构,展示如何查看您的当前目录路径并将您的目录添加到您的 shell 提示。本文首先展示一些简单的 cd 示例,然后解释什么是绝对路径 和相对路径,以及何时使用它们。然后,我将分享我最喜欢的一些省时的 cd 快捷键,比如如何转到您的主目录,如何识别任意用户的主目录。我还将展示如何在两个目录之间来回切换,并提供一个关于 cd 命令的小秘笈,我将其称为 cd 转移(shuffle)。那是在两个相似的目录路径之间移动的一个简单方法。

但是,在查看更改目录之前,重要的是要对 UNIX 目录结构有一定的理解。

向上浏览目录树

Windows® 操作系统中的文件夹 在 UNIX 中称为目录。目录 是包含几组文件和其他目录的容器。

UNIX 分支中的所有目录从根目录向下扩展,根目录用正斜杠(/)表示。例如:

  • 目录 /usr 是根目录(/)的一个子目录。
  • /usr/spool 目录是 /usr 的一个子目录。
  • /usr/spool/mail 目录是 /usr/spool 的一个子目录。

...以此类推。

我位于什么目录内?

从 shell 提示,您可以显示您所在的目录的路径名,方法是运行命令 pwd,如 清单 1 所示。可以通过以下方法记住这个命令:present working directory(当前工作目录)。

清单 1. 显示当前工作目录(pwd)
# pwd
# /home/anthony





cd 基础

要切换到另一个目录,命令格式为:cd + 空格 + 目标目录。记住,UNIX 命令是区分大小写的,因此,请采用小写字母,除非目录中的确有大写字母。在 清单 2 中的示例中,我正在更改到的每个目录都以一个正斜杠(/)开始,原因是我正在使用绝对路径,绝对路径是从根目录开始的目录路径。

清单 2. 使用绝对路径的 cd 命令
# cd /var
# cd /usr/spool/mail
# cd /home/anthony

您完全可以到达任何目录 — 如果有权限的话(您需要执行权限)— 使用它的绝对路径名。清单 2 中的命令作为示例提供。通常您不会在一行中运行两个 cd 命令,因为更改工作目录的目的是为了在其中进行一些工作,而不是直接移动到别的地方。

如果您进入的目录不是有效目录,或者您没有访问该目录的权限,cd 命令将报告一个错误。如果您的 cd 命令失败,那么您仍将处于原目录中。




我在哪里?

好吧,您的 cd 命令没有报告错误,因此假定它有效。但确定您现在所处的目录还是不错的。

当然,每当您想检查当前工作目录时,您都可以运行 pwd 命令,但还有更好的方法。只要 cd 命令成功运行,新的当前工作目录将存储在环境变量 $PWD(Present Working Directory)中。注意,与 pwd 命令不同,这个变量是大写。因此,您可以使用 echo 命令显示 $PWD 的值,如 清单 3 所示。

清单 3. 显示 $PWD
# echo $PWD
# /home/anthony

难道这不比您此前看到的运行 pwd 命令更容易吗?不管怎样,了解您的目录存储在一个变量中还是很有用。原因是:可以将 $PWD 的值显示为 shell 提示的一部分。

提示我的工作目录

目前为止,示例中的 shell 提示都设置为正斜杠、英镑符号、或符号 #。但是,如果您在 shell 提示中包含 $PWD,您就总是知道您当前所处的目录。然后,当您运行 cd 时,变量 PWD 将被更新并显示为 shell 提示的一部分。

通过添加 清单 4 中的行,可以在您主目录的 .profile 文件中设置 shell 提示变量 PS1。

清单 4. 在 shell 提示中包含 $PWD
PS1='${PWD} > '
export PS1

当您下次登录时,您的 .profile 文件将作为登录流程的一部分执行,这将把工作目录显示为 shell 提示的一部分。如果您知道如何达到您的主目录,现在就可以执行 .profile 文件(参见 清单 5)。

清单 5. 使用新的 shell 提示执行新的 .profile
# . ./.profile
/home/anthony >

您可以定制这个提示,以包含主机名、登录名、或者一些显示字符。要了解关于加强 shell 提示的更多信息,请参见 参考资料 中的文章链接 “Tip: Prompt magic”。

 

相对路径更好

当您只想从目录树的一个分支跳转到附近的另一个分支时,使用绝对路径会有点麻烦,这就是 cd 命令允许使用相对路径的原因。默认情况下,相对路径指的是相对于您所在的当前目录的路径。使用相对路径意味着更少的键击,尽管那取决于您要从哪个目录前往哪个目录。

例如,要从 /home/anthony 到 /home/anthony/bin,您不必输入目标目录的绝对路径(/home/anthony/bin);输入相对于您的当前目录的新路径即可,如 清单 6 所示。

清单 6. 使用一个相对路径的 cd 命令
/home/anthony > cd bin
/home/anthony/bin >

注意,shell 提示是如何显示 $PWD 的新值的。

访问父目录

如果您使用 -a 标志运行 ls 命令,将会看到两个条目:一个是 .(圆点),另一个是 ..(点-点)。单点表示当前目录,双点表示父目录 — 当前目录上边紧临的目录。

当您想通过 cd 到上一层目录时,使用父目录很方便,如 清单 7 所示。

清单 7. 使用 cd 命令前往父目录(点-点)
/var/spool/mqueue > cd ..
/var/spool >

然后您可以前往一个新的子目录(参见 清单 8)。

清单 8. 使用 cd 前往子目录
/var/spool > cd mail
/var/spool/mail >

或者,也可以在单个命令中实现上述切换,如 清单 9 所示。

清单 9. 在一个命令中从分支到分支
/var/spool/mqueue > cd ../mail
/var/spool/mail >

甚至可以向上或向下跳几个目录层级,如 清单 10 所示。

清单 10. 跳过几个分支
/usr/IBM/WebSphere/AppServer/profiles > cd ../../PortalServer/log
/usr/IBM/WebSphere/PortalServer/log >

一旦您习惯了使用相对路径,它将变为第二属性。
 

主目录快捷方式

每位 UNIX 用户都有一个主目录,在创建用户时定义。可以在 /etc/passwd 中或使用 smit 查询主目录,但有更好的方法返回主目录。

使用 cd 直接返回主目录

如果您想返回主目录,可以运行不带任何参数的 cd 命令,如 清单 11 所示。

清单 11. 使用 cd 命令快速返回主目录
/usr/IBM/WebSphere/PortalServer/log > cd
/home/anthony >

主目录保存在变量 $HOME 中,这意味着不带参数的 cd 命令相当于运行 cd $HOME(参见 清单 12)。

清单 12. cd $HOME
/var/spool/mail > cd $HOME
/home/anthony >

$HOME 变量对于了解主目录很有用,即使您现在不打算返回主目录。事实上,$HOME 变量太有用了,以至于它有一个别名:波浪号(~)。

调用主目录 — 波浪号

您可能需要查看或使用主目录中的文件。如果您位于其他目录中,不必先返回主目录或者键入完整的目录路径,只需使用波浪号即可。如 清单 13 所示,可以从主目录之外的某个地方随意复制主目录中的 .profile 文件。

清单 13. $HOME 的波浪号快捷方式
/usr/IBM/WebSphere > cp ~/.profile ~/.profile.save

远程访问您的邻居的主目录

还可以使用波浪号列示或处理另一个用户的主目录中的文件(如果有足够权限)。为此,执行后面带该用户登录名的波浪号命令,如 清单 14所示。

清单 14. 波浪号是每个人的 HOME
/home/anthony > cp ~john/.profile ~john/.profile.save

这比猜想用户的主目录更安全,比在 /etc/passwd 中查找更容易。

 

通过破折号返回

通常,您需要更改目录,只需运行一两个命令,然后返回上一个目录($OLDPWD)。为此,可以使用 cd dashback,即 cd 后面跟一个破折号(cd -)。在 清单 15 中,注意 $PS1 shell 提示如何在我每次运行 cd 命令时显示新目录。

清单 15. 返回上一个目录
/home/anthony > cd /usr/sys/inst.images
/usr/sys/inst.images > cd -
/home/anthony >

切换开关

使用这个 cd dashback 的结果是:如果两次输入该命令,就可以在两个目录之间来回切换。这个功能在下面这种情况下很有用:您想在一个目录中更改一个程序或配置文件,然后在另一个目录下的日志文件中查看结果。清单 16 展示了两个目录之间的切换。与其他示例类似,我将跳过您在实际更改目录后可能立即会运行的命令。

清单 16. 在 $PWD 和 $OLDPWD 之间切换
/data/log > cd /apps/config
/apps/config > cd -
/data/log > cd -
/apps/config >


cd 转移

我发现一个特别有用的特性是 cd 转移。当两个目录路径只有一个区别(比如一个单词不同)时,这个是从旧目录切换到新目录的一种简单方法。

对于从没用过这个特性的 UNIX 老手来说,这个语法可能有些奇怪,但它的确有效,参见 清单 17。

清单 17. cd 转移语法
cd directorya directoryb

第一个参数是当前目录路径中需要替换的参数,第二个参数是替换字符串。例如,要从 v7 移动到 v8,只需键入 cd v7 v8,如 清单 18 所示。

清单 18. 使用 cd 转移
/programs/v7/reports/monthly > cd v7 v8
/programs/v8/reports/monthly >

一个命令就节约了 19 次键击!这比向上三个父目录,然后沿目录树向下,或者使用绝对路径要简单得多。

这个两个参数 cd 命令有很多用途:在类似的路径之间切换,这些路径的惟一区别是一个数据库实例名、一个分支名、或者也许是一个日期。cd 转移可以在非常短的时间内为您节约数千次键击。

跳过历史

如果历史上的每年每月都有一个对应目录,cd 转移允许从一年跳到另一年,清单 19 展示了它的工作方式。

清单 19. 新年
/hist/2010/april/reports > cd 2010 2011
/hist/2011/april/reports >

如果您想更改到同一年中的一个不同的月,使用 cd 转移,以 from 月份和 to 月份作为参数,如 清单 20 所示。

清单 20. 切换月份目录
/hist/2011/april/reports > cd april may
/hist/2011/may/reports >

如果两个目录路径只有一个字符串不同,cd 转移特性比较理想。

 

cd 没问题吗?

当我在脚本中使用 cd 时,我总是验证更改目录命令有效后才继续下一条命令。我曾经看到一个操作系统被一个两年来每天都在运行的两行清理脚本擦除。当一个远程主机关闭时,一个 NFS 加载的目录将变得不可用。cd 命令失败,清理脚本一直继续,直到系统上没有任何东西留下可以清理。

在继续进行其他操作之前验证 cd 命令已生效的一种简单方法是在 cd 命令之后立即使用 shell 短路 && 。如果 cd 命令失败,下一条命令将不会继续。参见 清单 21。

清单 21. cd 和短路
cd /some/dir && rm *.log

(责任编辑:IT)