基本介绍
tree 是一个递归列出目录内容的命令行工具,以树状格式显示文件和目录结构。
配置文件
可以在 ~/.config/tree/config 或通过别名设置常用参数:
# 在 ~/.bashrc 或 ~/.zshrc 中添加
alias tree='tree --dirsfirst -C' # 目录优先,彩色输出
alias tree2='tree -L 2' # 快速查看2层结构
安装方法
# Ubuntu/Debian
sudo apt-get install tree
# CentOS/RHEL
sudo yum install tree
# macOS
brew install tree
基本语法
tree [选项] [目录]
常用参数
- 目录层级控制
# 限制显示层级
tree -L 2 # 只显示2层目录
tree -L 3 /etc # 显示/etc目录下3层
# 只显示目录
tree -d
# 显示完整路径
tree -f
- 文件过滤
# 模式匹配
tree -P "*.txt" # 只显示.txt文件
tree -I "*.log" # 排除.log文件
# 组合模式
tree -P "*.sh|*.py" # 显示.sh和.py文件
tree -I "node_modules|.git" # 排除多个目录
- 显示选项
# 显示文件大小
tree -h # 人类可读格式
tree --si # 使用SI单位(1000进制)
# 显示权限信息
tree -p # 显示文件权限
tree -u # 显示文件所有者
tree -g # 显示文件所属组
# 显示最后修改时间
tree -D
- 排序选项
# 排序方式
tree -r # 反向排序
tree -t # 按修改时间排序
tree -U # 不排序(默认按字母排序)
- 输出控制
# 输出到文件
tree > structure.txt # 保存到文件
tree -o output.txt # 指定输出文件
# JSON/XML格式
tree -J # JSON格式输出
tree -X # XML格式输出
# HTML格式
tree -H -o tree.html # 生成HTML文件
- 实用组合示例
# 显示项目结构,排除常见忽略文件
tree -I "node_modules|.git|dist|*.log"
# 显示带大小的目录结构
tree -h --du
# 只显示目录,并限制深度
tree -d -L 2
# 显示完整信息
tree -pughD
# 显示所有文件(包括隐藏文件)
tree -a
# 显示文件统计信息
tree --filelimit 10 # 不显示超过10个文件的目录内容
参数速查表
参数速查表
参数 作用
-a 显示所有文件(包括隐藏文件)
-d 只显示目录
-L n 限制显示n层
-P pattern 只显示匹配模式的文件
-I pattern 排除匹配模式的文件
-h 人类可读文件大小
-p 显示文件权限
-u 显示文件所有者
-g 显示文件所属组
-D 显示最后修改时间
-f 显示完整路径
--du 显示目录大小
--prune 忽略空目录
展示目录下的内容
#!/bin/bash
# 指定目录路径
DIR="/tmp/"
# 检查目录是否存在
if [ ! -d "$DIR" ]; then
echo "目录不存在: $DIR"
exit 1
fi
# 遍历目录中的所有文件和目录
for item in "$DIR"/*; do
if [ -f "$item" ]; then
echo "文件: $item"
elif [ -d "$item" ]; then
echo "目录: $item"
fi
done
#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# 日志配置
LOG_DIR="./logs"
LOG_FILE="$LOG_DIR/directory_scan_$(date +%Y%m%d_%H%M%S).log"
DEBUG_MODE=false # 调试模式开关
# 创建日志目录
mkdir -p "$LOG_DIR"
# 日志函数
log_info() {
local msg="[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
echo -e "${GREEN}$msg${NC}" | tee -a "$LOG_FILE"
}
log_warn() {
local msg="[WARN] $(date '+%Y-%m-%d %H:%M:%S') - $1"
echo -e "${YELLOW}$msg${NC}" | tee -a "$LOG_FILE"
}
log_error() {
local msg="[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1"
echo -e "${RED}$msg${NC}" | tee -a "$LOG_FILE"
}
log_debug() {
if [ "$DEBUG_MODE" = true ]; then
local msg="[DEBUG] $(date '+%Y-%m-%d %H:%M:%S') - $1"
echo -e "${CYAN}$msg${NC}" | tee -a "$LOG_FILE"
fi
}
log_success() {
local msg="[SUCCESS] $(date '+%Y-%m-%d %H:%M:%S') - $1"
echo -e "${GREEN}$msg${NC}" | tee -a "$LOG_FILE"
}
# 彩色输出函数(不记录日志)
print_colored() {
local color="$1"
local message="$2"
echo -e "${color}${message}${NC}"
}
# 显示进度条
show_progress() {
local current=$1
local total=$2
local percent=$((current * 100 / total))
local filled=$((percent / 2))
local empty=$((50 - filled))
printf "\r进度: ["
printf "%${filled}s" | tr ' ' '='
printf "%${empty}s" | tr ' ' ' '
printf "] %3d%%" "$percent"
}
# 主程序开始
clear
print_colored "$CYAN" "=========================================="
print_colored "$WHITE" " 目录扫描工具 v1.0"
print_colored "$CYAN" "=========================================="
echo ""
# 指定目录路径(支持命令行参数)
DIR="${1:-/path/to/directory}" # 使用第一个参数或默认路径
log_info "开始扫描目录: $DIR"
log_debug "日志文件路径: $LOG_FILE"
# 检查目录是否存在
if [ ! -d "$DIR" ]; then
log_error "目录不存在: $DIR"
print_colored "$RED" "错误: 目录 '$DIR' 不存在"
exit 1
fi
log_success "目录验证通过"
# 统计变量
file_count=0
dir_count=0
total_items=0
error_count=0
# 先统计总项目数(用于进度条)
log_debug "正在统计项目总数..."
total_items=$(find "$DIR" -maxdepth 1 -mindepth 1 2>/dev/null | wc -l)
log_debug "找到 $total_items 个项目"
if [ $total_items -eq 0 ]; then
log_warn "目录为空: $DIR"
print_colored "$YELLOW" "警告: 目录为空"
exit 0
fi
# 遍历目录中的所有文件和目录
current_item=0
log_info "开始遍历目录内容..."
print_colored "$BLUE" "\n目录内容列表:"
print_colored "$BLUE" "----------------------------------------"
for item in "$DIR"/*; do
# 跳过不存在的文件(当目录为空时)
[ -e "$item" ] || continue
((current_item++))
show_progress $current_item $total_items
if [ -f "$item" ]; then
((file_count++))
filename=$(basename "$item")
# 获取文件大小
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
size=$(stat -f%z "$item" 2>/dev/null || echo "0")
else
# Linux
size=$(stat -c%s "$item" 2>/dev/null || echo "0")
fi
# 人性化显示文件大小
if [ $size -ge 1048576 ]; then
size_display="$((size / 1048576))MB"
elif [ $size -ge 1024 ]; then
size_display="$((size / 1024))KB"
else
size_display="${size}B"
fi
echo -e "\n${GREEN}[文件]${NC} $filename ${CYAN}($size_display)${NC}"
log_debug "找到文件: $filename (大小: $size_display)"
elif [ -d "$item" ]; then
((dir_count++))
dirname=$(basename "$item")
echo -e "\n${YELLOW}[目录]${NC} $dirname"
log_debug "找到目录: $dirname"
else
((error_count++))
log_warn "未知类型: $item"
echo -e "\n${RED}[未知]${NC} $(basename "$item")"
fi
done
echo -e "\n" # 换行
print_colored "$BLUE" "----------------------------------------"
# 输出统计信息
echo ""
log_info "扫描完成"
print_colored "$GREEN" "统计信息:"
print_colored "$WHITE" " 文件数量: ${GREEN}$file_count${NC}"
print_colored "$WHITE" " 目录数量: ${YELLOW}$dir_count${NC}"
if [ $error_count -gt 0 ]; then
print_colored "$RED" " 错误数量: $error_count"
fi
print_colored "$WHITE" " 总计项目: $((file_count + dir_count))"
# 显示日志文件位置
echo ""
log_success "日志已保存到: $LOG_FILE"
print_colored "$CYAN" "日志文件: $LOG_FILE"
# 可选:显示最后几行日志
if [ "$DEBUG_MODE" = true ]; then
echo ""
print_colored "$PURPLE" "最近日志记录:"
print_colored "$PURPLE" "----------------------------------------"
tail -5 "$LOG_FILE" | while read line; do
echo -e "$line"
done
fi
exit 0