dtree

作者:Phil Hughes

虽然 Linux 自带数百个实用程序,但总会觉得缺少一些你在其他系统上习惯使用的东西。其中一个程序就是显示目录层次结构或目录树的工具。

虽然一些在 X-Windows 下运行的文件管理器可以完成这类任务,但拥有一个命令行版本有时非常方便。dtree 实用程序虽然不是 Linux 专用的,但正属于此类程序。

我将首先解释如何使用 dtree,然后解释它的工作原理。如果您只输入它的名称来调用它,它将显示从当前目录开始的目录层次结构。 如果您使用参数调用它,则该参数将用作起始目录。 例如,如果您输入dtree /home/fyl/Cool,将显示 /home/fyl/Cool 下的目录树。

dtree 是用最好的老式 Unix 传统编写的,它使用通用实用程序和一小段 shell 脚本将它们粘合在一起。 这是该程序

: dtree
: dtree
# print a hierarchy tree starting at
# specified directory (. default)
(cd ${1-.}; pwd)
find ${1-.} -type d -print | sort -f |
sed -e "s,^${1-.},," -e "/^$/d" -e \
"s,[^/]*/\([^/]*\)$,\`-----\1," -e "s,[^/]*/,|      ,g"

在您惊慌失措之前,请记住,它只有四行加上注释。弄清楚它并不难。 第一步是运行该程序并生成一些示例输出。 如果您手头没有电脑,或者想在成为信徒之前看看它做了什么,我已经包含了我在当前目录 (/home/fyl/LJ) 中运行它所得到的结果。

/home/fyl/LJ
`-----Advertising
`-----Ams
`-----Ams.old
`-----Angoss
|     `-----Orig
|     `-----Shots
`-----Artsys
`-----Buyer
`-----Caldera
`-----Employee
`-----Fms
`-----Jobs
`-----ljml.d
|      `-----src.d
|      `-----tst.d
`-----OSW
`-----Posts
`-----Presentations
|       `-----Amus
|       `-----Boston
|       `-----Cjk
|       `-----Decus
|       |        `-----Old
|       |        `-----Vancouver.96
|       `-----UW
`-----Progs
`-----Related
`-----Work
`-----Write

输出的第一行是运行 dtree 的目录的名称。 该行由以 (cd 开头的行生成。 将此行分解

  • ${1-.} 表示使用命令行中的第一个参数 ($1)(如果有),否则使用 .,它是当前目录的同义词。 因此,cd 命令要么更改为在调用 dtree 的行上指定的目录,要么更改为当前目录(实际上什么也不做)。

  • 然后 pwd 显示当前目录的路径名。

  • 整个行周围的括号强制该命令在子 shell 中运行。 这意味着 cd 命令是此行的本地命令,后续命令将从 dtree 最初调用时所在的当前目录执行。

  • find 命令输出类型为 d(表示目录)的所有文件。 与 cd 中一样,使用相同的目录引用。

  • find 的输出通过管道传送到 sort-f 选项告诉 sort 将大小写名称折叠在一起。

  • 树的棘手格式由 sed 分四个步骤完成。 每个步骤都由 -e 分隔。 这就是你告诉 sed 程序的方式。

  • 第一个表达式 s,^${1-.},," 是一个替换命令,它告诉 sed 将前两个分隔符(逗号用作分隔符)之间的所有内容替换为第二个分隔符之间的所有内容。 初始 ^ 导致匹配仅在行首执行。 后面的表达式再次是起始目录引用,第二对分隔符之间的字符串为空。 因此,从 sort 的输出开始的请求目录名称被删除。

  • 第二个表达式 /^$/d 告诉 sed 删除所有空行(开头和结尾之间没有任何内容的行)。

  • 第三个表达式可能最棘手。 它使用了记住正则表达式中的字符串并在以后使用的能力。 表达式 s,[^/]*/\([^/]*\)$,\`-----\1, 告诉 sed 将由斜杠 (/) 分隔的最后两个字符串替换为反引号、五个短划线和最后一个字符串(在最后一个斜杠之后)。

  • 最后,最后一个表达式 -e "s,[^/]*/,|      ,g" 告诉 sed 将每次出现的字符串(不包含斜杠但后跟斜杠)替换为管道 (|) 和六个空格。

除非您熟悉正则表达式,否则您可能没有完全理解。 但您可能学到了一些东西,并且您可以轻松地使用 dtree,而无需了解它的工作原理。

加载 Disqus 评论