解释一个 shell 脚本来递归打印完整的目录树

Abh*_*hek 6 command-line bash scripts

我找到了一个递归打印完整目录树的脚本,但我无法理解。谁能完整描述一下?我刚刚开始编写 shell 脚本。这是代码:

#!/bin/bash
walk() {
        local indent="${2:-0}"
        printf "%*s%s\n" $indent '' "$1"
        for entry in "$1"/*; do
                [[ -d "$entry" ]] && walk "$entry" $((indent+4))
        done
}
walk "$1"
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 9

该脚本定义了一个函数walk(),然后walk在传递给脚本的第一个参数上运行。

函数首先定义一个局部变量(只有函数及其子函数知道) indent

indent在本地定义为"${2:-0}"。这意味着如果$2walk命令接收的第二个参数)未设置,则 make it 0。此变量local使您无法自己将第二个参数传递给脚本。

该函数然后$1以这种格式打印在命令行 ( )上指定的目录的内容

printf "%*s%s\n" $indent '' "$1"
Run Code Online (Sandbox Code Playgroud)

这意味着,打印$indent空格数,然后将目录名称打印为字符串(因此不需要数字),然后打印换行符。

然后函数运行一个循环

for entry in $1/*; do
Run Code Online (Sandbox Code Playgroud)

这会将$1(指定为 的第一个参数的目录)中的每个非隐藏文件或子目录分配给walk变量entry并循环遍历它们,对它们运行以下命令:

[[ -d "$entry" ]] && walk "$entry" $((indent+4))
Run Code Online (Sandbox Code Playgroud)

这意味着,如果entry是目录,则walkentry. 现在walk有第二个参数$((indent+4)),它将被用作0的新值而不是indent。这样做的效果是一级目录根本没有缩进,但是二级目录缩进了4个空格,第三级缩进了8个空格,等等。 由于entry现在$1walk函数的第一个参数,它会在整个过程中递归结构体。

脚本通过walk在位置参数上运行函数结束,位置参数$1是传递给脚本的第一个参数。用法可能是

./script directory
Run Code Online (Sandbox Code Playgroud)

这意味着directory$1walk将上运行directory

如果脚本打印我认为的常规文件会很好,但是如果没有一些精心设计的格式,它们看起来会很混乱。我建议tree为此目的使用而不是脚本!