You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:27:25