解释 shell 脚本以递归方式打印完整目录树

解释 shell 脚本以递归方式打印完整目录树

我找到了一个可以递归打印完整目录树的脚本,但我看不懂。有人能完整地描述一下吗?我刚开始写 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"

答案1

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

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

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

$1然后,该函数以以下格式打印命令行 () 中指定的目录的内容

printf "%*s%s\n" $indent '' "$1"

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

然后函数循环运行

for entry in $1/*; do

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

[[ -d "$entry" ]] && walk "$entry" $((indent+4))

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

脚本最后walk在位置参数 上运行该函数$1,即传递给脚本的第一个参数。用法可以是

./script directory

这意味着directory正在$1并且walk将会在 上运行directory

我认为如果脚本可以打印常规文件就好了,但如果没有一些复杂的格式,它们看起来会很混乱。我建议使用tree这个而不是脚本!

相关内容