我找到了一个可以递归打印完整目录树的脚本,但我看不懂。有人能完整地描述一下吗?我刚开始写 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
第一个参数,它将在整个结构中递归。$1
walk
脚本最后walk
在位置参数 上运行该函数$1
,即传递给脚本的第一个参数。用法可以是
./script directory
这意味着directory
正在$1
并且walk
将会在 上运行directory
。
我认为如果脚本可以打印常规文件就好了,但如果没有一些复杂的格式,它们看起来会很混乱。我建议使用tree
这个而不是脚本!