tree

基本介绍

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 [选项] [目录]

常用参数

  1. 目录层级控制
# 限制显示层级
tree -L 2        # 只显示2层目录
tree -L 3 /etc   # 显示/etc目录下3层

# 只显示目录
tree -d

# 显示完整路径
tree -f
  1. 文件过滤
# 模式匹配
tree -P "*.txt"      # 只显示.txt文件
tree -I "*.log"      # 排除.log文件

# 组合模式
tree -P "*.sh|*.py"  # 显示.sh和.py文件
tree -I "node_modules|.git"  # 排除多个目录
  1. 显示选项
# 显示文件大小
tree -h          # 人类可读格式
tree --si        # 使用SI单位(1000进制)

# 显示权限信息
tree -p          # 显示文件权限
tree -u          # 显示文件所有者
tree -g          # 显示文件所属组

# 显示最后修改时间
tree -D
  1. 排序选项
# 排序方式
tree -r          # 反向排序
tree -t          # 按修改时间排序
tree -U          # 不排序(默认按字母排序)
  1. 输出控制
# 输出到文件
tree > structure.txt           # 保存到文件
tree -o output.txt             # 指定输出文件

# JSON/XML格式
tree -J          # JSON格式输出
tree -X          # XML格式输出

# HTML格式
tree -H -o tree.html  # 生成HTML文件
  1. 实用组合示例
# 显示项目结构,排除常见忽略文件
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容