如何在Bash中实现文件系统的前序遍历?
实现Bash下的文件系统前序遍历单行命令
你可以使用以下Bash单行命令来实现前序遍历(先输出目录,再输出该目录下的所有文件,最后递归处理子目录):
preorder() { local d="$1"; echo "$d"; ls -1 "$d" | while read f; do local p="$d/$f"; [ -f "$p" ] && echo "$p"; [ -d "$p" ] && preorder "$p"; done; }; preorder . | sed 's|././|./|'
命令说明:
preorder():定义一个递归函数,接收当前目录路径作为参数echo "$d":先输出当前目录(前序遍历的核心:先访问节点)ls -1 "$d":按字典序列出当前目录下的所有条目,每行一个- 循环处理每个条目:
- 拼接成完整路径
$p - 如果是文件(
[ -f "$p" ]),直接输出 - 如果是目录(
[ -d "$p" ]),递归调用preorder处理该子目录
- 拼接成完整路径
sed 's|././|./|':修正根目录下条目生成的冗余路径(比如将././a.txt转为./a.txt)
验证效果
针对你给出的目录结构,运行该命令会输出:
. ./a.txt ./sub2 ./sub2/e.txt ./sub1 ./sub1/b.txt ./sub1/c.txt ./sub1/z.txt ./sub1/sub3 ./sub1/sub3/d.txt
完全符合你需要的前序排列要求。
为什么find和普通sort无法实现?
find默认采用深度优先遍历,会先深入子目录处理内容,再返回父目录处理后续文件,导致子目录的文件出现在父目录的后续文件之前(比如你的例子中./sub1/sub3/d.txt在./sub1/z.txt之前)- 普通
sort只能按字符串字典序排序,无法区分路径中的文件和目录类型,也无法体现前序遍历的层级优先逻辑
内容的提问来源于stack exchange,提问作者Trevor Hickey
相关产品推荐
相关产品推荐

