实用脚本能生成文件目录树吗?

wen 实用脚本 2

本文目录导读:

实用脚本能生成文件目录树吗?

  1. Python脚本(最通用)
  2. Bash脚本(Linux/Mac)
  3. PowerShell脚本(Windows)
  4. 排除特定目录的版本
  5. 输出到文件的版本

是的,完全可以!下面是几个实用的脚本,可以生成文件目录树,覆盖不同场景:

Python脚本(最通用)

import os
import sys
from pathlib import Path
def generate_tree(directory, prefix="", max_depth=None, current_depth=0):
    """
    生成目录树结构
    :param directory: 目录路径
    :param prefix: 前缀字符串
    :param max_depth: 最大深度限制
    :param current_depth: 当前深度
    """
    if max_depth is not None and current_depth > max_depth:
        return
    try:
        items = sorted(os.listdir(directory))
    except PermissionError:
        print(f"{prefix}└── [权限不足]")
        return
    items = [item for item in items if not item.startswith('.')]  # 忽略隐藏文件
    for i, item in enumerate(items):
        path = os.path.join(directory, item)
        is_last = i == len(items) - 1
        # 当前项的前缀
        current_prefix = "└── " if is_last else "├── "
        if os.path.isdir(path):
            print(f"{prefix}{current_prefix}{item}/")
            next_prefix = "    " if is_last else "│   "
            generate_tree(path, prefix + next_prefix, max_depth, current_depth + 1)
        else:
            print(f"{prefix}{current_prefix}{item}")
if __name__ == "__main__":
    # 用法:python script.py [目录路径] [最大深度]
    target_dir = sys.argv[1] if len(sys.argv) > 1 else "."
    max_depth = int(sys.argv[2]) if len(sys.argv) > 2 else None
    print(f"目录树: {target_dir}")
    print(f"深度限制: {'无限制' if max_depth is None else max_depth}")
    print()
    print(target_dir + "/")
    generate_tree(target_dir, max_depth=max_depth)

使用方法:

python tree_generator.py /path/to/directory 3  # 限制深度为3

Bash脚本(Linux/Mac)

#!/bin/bash
# 目录树生成脚本
# 用法: ./tree.sh [目录路径] [最大深度]
TARGET_DIR="${1:-.}"
MAX_DEPTH="${2:-}"
# 显示目录树(使用系统tree命令或替代方案)
if command -v tree &> /dev/null; then
    # 系统有tree命令
    if [ -n "$MAX_DEPTH" ]; then
        tree -L "$MAX_DEPTH" "$TARGET_DIR"
    else
        tree "$TARGET_DIR"
    fi
else
    # 没有tree命令,使用find实现简易版本
    echo "使用find替代tree命令..."
    if [ -n "$MAX_DEPTH" ]; then
        find "$TARGET_DIR" -maxdepth "$MAX_DEPTH" -not -path '*/\.*' | \
            sort | sed 's|[^/]*/|  |g' | sed 's|  |├── |'
    else
        find "$TARGET_DIR" -not -path '*/\.*' | \
            sort | sed 's|[^/]*/|  |g' | sed 's|  |├── |'
    fi
fi

使用方法:

chmod +x tree.sh
./tree.sh /path/to/directory 2

PowerShell脚本(Windows)

# generate-tree.ps1
param(
    [string]$Path = ".",
    [int]$MaxDepth = -1,
    [switch]$ShowHidden
)
function Show-Tree {
    param(
        [string]$CurrentPath,
        [string]$Prefix = "",
        [int]$CurrentDepth = 0,
        [int]$MaxDepth = -1,
        [bool]$ShowHidden = $false
    )
    if ($MaxDepth -ge 0 -and $CurrentDepth -gt $MaxDepth) {
        return
    }
    try {
        $items = Get-ChildItem -Path $CurrentPath -ErrorAction Stop
    }
    catch {
        Write-Host "$Prefix└── [访问被拒绝: $CurrentPath]"
        return
    }
    # 过滤隐藏文件
    if (-not $ShowHidden) {
        $items = $items | Where-Object { -not $_.PSIsContainer -or -not $_.Name.StartsWith('.') }
        $items = $items | Where-Object { -not $_.Name.StartsWith('.') }
    }
    $itemArray = @($items | Sort-Object Name)
    for ($i = 0; $i -lt $itemArray.Length; $i++) {
        $item = $itemArray[$i]
        $isLast = ($i -eq $itemArray.Length - 1)
        $currentPrefix = if ($isLast) { "└── " } else { "├── " }
        if ($item.PSIsContainer) {
            Write-Host "$Prefix$currentPrefix$($item.Name)/"
            $nextPrefix = if ($isLast) { "    " } else { "│   " }
            Show-Tree -CurrentPath $item.FullName -Prefix ($Prefix + $nextPrefix) `
                     -CurrentDepth ($CurrentDepth + 1) -MaxDepth $MaxDepth -ShowHidden $ShowHidden
        }
        else {
            $size = "{0:N0}KB" -f ($item.Length / 1KB)
            Write-Host "$Prefix$currentPrefix$($item.Name) ($size)"
        }
    }
}
# 主程序
$resolvedPath = Resolve-Path $Path -ErrorAction Stop
Write-Host "目录树: $resolvedPath"
if ($MaxDepth -ge 0) {
    Write-Host "最大深度: $MaxDepth"
}
Write-Host "`n$resolvedPath/"
Show-Tree -CurrentPath $resolvedPath -MaxDepth $MaxDepth -ShowHidden $ShowHidden

使用方法:

.\generate-tree.ps1 -Path "C:\MyFolder" -MaxDepth 3

排除特定目录的版本

# 带有排除功能的Python版本
def generate_tree_advanced(directory, prefix="", max_depth=None, exclude_dirs=None):
    """
    高级目录树生成,可以排除特定目录
    """
    if exclude_dirs is None:
        exclude_dirs = {'node_modules', '.git', '__pycache__', '.venv', 'venv'}
    if max_depth is not None and current_depth > max_depth:
        return
    try:
        items = [f for f in os.listdir(directory) if not f.startswith('.')]
        items = [f for f in items if f not in exclude_dirs]
        items.sort()
    except PermissionError:
        return
    for i, item in enumerate(items):
        path = os.path.join(directory, item)
        is_last = i == len(items) - 1
        if os.path.isdir(path):
            print(f"{prefix}{'└── ' if is_last else '├── '}{item}/")
            next_prefix = "    " if is_last else "│   "
            generate_tree_advanced(path, prefix + next_prefix, max_depth, 
                                 exclude_dirs, current_depth + 1)
        else:
            print(f"{prefix}{'└── ' if is_last else '├── '}{item}")

输出到文件的版本

#!/bin/bash
# 将目录树输出到文件
TARGET_DIR="${1:-.}"
OUTPUT_FILE="${2:-directory_tree.txt}"
if command -v tree &> /dev/null; then
    tree "$TARGET_DIR" > "$OUTPUT_FILE"
else
    find "$TARGET_DIR" -type f -o -type d | sort > "$OUTPUT_FILE"
fi
echo "目录树已保存到: $OUTPUT_FILE"

推荐使用场景:

  • Python脚本:跨平台,功能最完整,可定制性强
  • Bash脚本:Linux/Mac用户最方便
  • PowerShell:Windows用户最佳选择
  • 系统tree命令:如果系统已安装,最简单直接

这些脚本可以帮你快速生成项目目录结构,用于文档、项目说明或代码审查。

抱歉,评论功能暂时关闭!