Linux tree命令详解

tree 命令用于以树状图形式递归列出目录的内容,它能直观地显示目录和文件的结构关系。tree命令不是所有Linux发行版默认安装的,但可以通过包管理器轻松安装。

安装tree命令
Ubuntu/Debian
sudo apt update
sudo apt install tree
CentOS/RHEL/Fedora
sudo yum install tree
# 或者
sudo dnf install tree

语法格式

tree [选项] [目录]

如果未指定目录,默认使用当前目录。

功能说明

  • 树状展示:以树形结构递归显示目录内容
  • 多种输出:支持文本、HTML、XML等多种输出格式
  • 过滤功能:可基于模式匹配排除或包含特定文件/目录
  • 详细信息:可显示文件权限、所有者、大小等详细信息
  • 深度控制:可限制显示的目录深度

常用选项

选项 说明
-a 显示所有文件和目录(包括隐藏文件)
-d 只显示目录
-f 显示每个文件的完整路径
-i 不显示树状线条,仅列出文件
-l 跟随符号链接(像目录一样递归显示)
-p 显示文件的权限(类似ls -l)
-u 显示文件所有者
-g 显示文件所属组
-s 显示文件大小(字节)
-h 以人类可读格式显示文件大小(K,M,G)
-D 显示文件的最后修改时间
-L 层级 限制显示的目录深度
-P 模式 只显示符合模式的文件/目录
-I 模式 排除符合模式的文件/目录
-o 文件 将输出重定向到文件
-H 基URL 输出HTML格式,带超链接
--help 显示帮助信息
--version 显示版本信息

使用示例

示例1:基本用法 - 显示当前目录结构

# 显示当前目录的树状结构
tree
.
├── dir1
│   ├── file1.txt
│   └── file2.txt
├── dir2
│   └── subdir
│       └── file3.txt
├── README.md
└── script.sh

3 directories, 4 files

示例2:显示指定目录结构

# 显示/etc目录的结构(前两层)
tree -L 2 /etc

示例3:显示所有文件包括隐藏文件

tree -a ~

示例4:只显示目录

tree -d /var/log
/var/log
├── apt
├── cups
├── installer
└── nginx
    ├── access.log
    └── error.log

示例5:显示详细信息

tree -pugh -h -D
.
├── [drwxr-xr-x root     root     4.0K Oct 15 08:30]  dir1
│   ├── [-rw-r--r-- user     users    1.2K Oct 14 10:15]  file1.txt
│   └── [-rw-r--r-- user     users     234 Oct 14 10:16]  file2.txt
└── [-rwxr-xr-x user     users     980 Oct 15 09:00]  script.sh

示例6:过滤文件

# 只显示.txt文件
tree -P "*.txt" .

# 排除.txt文件
tree -I "*.txt" .

# 排除多个模式
tree -I "*.txt|*.log" .

# 只显示包含"test"的目录/文件
tree -P "*test*" .

示例7:限制显示深度

# 只显示2层深度
tree -L 2 /usr

# 显示完整路径(结合深度限制)
tree -f -L 2 /etc

示例8:输出到文件

# 输出到文件
tree -o directory_structure.txt

# 输出HTML格式
tree -H . -o index.html

# 输出带样式的HTML
tree -H . -C -o tree.html

示例9:统计信息

# 仅显示统计信息,不显示树状图
tree -i
tree --filelimit 10  # 不显示包含超过10个文件的目录内容

进阶用法

1. 与其他命令结合使用

# 结合grep过滤
tree -f | grep -E "\.(py|js|html)$"

# 统计不同类型的文件数量
tree -i | grep -c "\.txt$"
tree -i | grep -c "\.py$"

# 生成项目文档结构
tree -I "node_modules|.git|__pycache__" -o PROJECT_STRUCTURE.md

2. 在脚本中使用tree

#!/bin/bash
# 备份前记录目录结构
BACKUP_DIR="/var/backups"
LOG_FILE="/var/log/backup_structure.log"

echo "=== 备份目录结构 $(date) ===" >> "$LOG_FILE"
tree -h -D "$BACKUP_DIR" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# 检查特定目录大小
PROJECT_DIR="/home/user/project"
echo "项目目录结构及大小:"
tree -sh "$PROJECT_DIR" | head -20

3. 比较目录结构

#!/bin/bash
# 比较两个目录的结构差异
dir1="/path/to/dir1"
dir2="/path/to/dir2"

# 生成文件列表
tree -i -f "$dir1" | sort > /tmp/dir1_list.txt
tree -i -f "$dir2" | sort > /tmp/dir2_list.txt

# 比较差异
echo "只在dir1中存在的文件:"
comm -23 /tmp/dir1_list.txt /tmp/dir2_list.txt

echo "只在dir2中存在的文件:"
comm -13 /tmp/dir1_list.txt /tmp/dir2_list.txt

4. 生成项目README的结构图

# 生成适合插入README.md的目录结构
echo "## 项目结构" > README.md
echo '```' >> README.md
tree -I ".git|node_modules|__pycache__|*.pyc|*.o" --dirsfirst >> README.md
echo '```' >> README.md

5. 颜色输出控制

# 总是使用颜色
tree -C

# 不使用颜色
tree --noreport

# 自定义颜色方案(如果支持)
tree -C -A  # 使用ANSI线条
tree -C -N  # 不格式化输出,显示原始字符

配置文件

tree命令可以通过环境变量和配置文件进行自定义:

# 设置tree的选项别名
alias tree='tree -C -h -I "*.pyc|__pycache__"'

# 在~/.bashrc中永久设置
echo 'alias tree="tree -C -h"' >> ~/.bashrc

# 配置文件位置(如果存在)
# /etc/tree.conf  # 系统全局配置
# ~/.treerc       # 用户配置

注意事项

  • tree命令可能需要手动安装:sudo apt install treesudo yum install tree
  • 对于大型目录,tree可能会消耗较多时间和内存
  • 符号链接循环可能导致tree无限递归,使用 -l 选项时要小心
  • 某些选项可能在不同版本的tree中有所差异
  • 使用 --filelimit 可以避免显示包含大量文件的目录内容
  • tree输出的颜色可能在重定向到文件时丢失,使用 -C 强制颜色输出
  • HTML输出功能可以用于生成网站目录导航

相关命令

  • ls - 列出目录内容
  • find - 查找文件
  • du - 查看目录大小
  • pwd - 显示当前目录
  • cd - 切换目录
  • mkdir - 创建目录
  • rmdir - 删除空目录