本文目录导读:

我来提供一个跨平台的文件夹快照生成脚本,包含多个实用版本。
Python版本(最全面、跨平台)
#!/usr/bin/env python3
"""
文件夹快照生成器
功能:生成文件夹结构、文件大小、修改时间等信息
"""
import os
import json
import hashlib
from datetime import datetime
from pathlib import Path
def get_file_info(file_path, base_path):
"""获取文件详细信息"""
try:
stat = file_path.stat()
rel_path = str(file_path.relative_to(base_path))
# 计算文件哈希(可选,用于检测文件变化)
# sha256_hash = hashlib.sha256()
# with open(file_path, "rb") as f:
# for byte_block in iter(lambda: f.read(4096), b""):
# sha256_hash.update(byte_block)
# file_hash = sha256_hash.hexdigest()
return {
"path": rel_path,
"type": "file",
"size": stat.st_size,
"size_human": format_size(stat.st_size),
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat(),
"created": datetime.fromtimestamp(stat.st_ctime).isoformat(),
"permissions": oct(stat.st_mode)[-3:]
# "hash": file_hash # 启用哈希计算
}
except (OSError, IOError) as e:
return {
"path": str(file_path),
"type": "file",
"error": str(e)
}
def get_dir_info(dir_path, base_path):
"""获取目录信息"""
try:
rel_path = str(dir_path.relative_to(base_path))
stat = dir_path.stat()
return {
"path": rel_path,
"type": "directory",
"modified": datetime.fromtimestamp(stat.st_mtime).isoformat(),
"created": datetime.fromtimestamp(stat.st_ctime).isoformat(),
"permissions": oct(stat.st_mode)[-3:]
}
except (OSError, IOError) as e:
return {
"path": str(dir_path),
"type": "directory",
"error": str(e)
}
def format_size(size_bytes):
"""格式化文件大小"""
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
if size_bytes < 1024.0:
return f"{size_bytes:.2f} {unit}"
size_bytes /= 1024.0
return f"{size_bytes:.2f} PB"
def generate_snapshot(directory, output_format='json', exclude_patterns=None):
"""生成文件夹快照"""
base_path = Path(directory).resolve()
if not base_path.exists():
print(f"错误: 路径 {directory} 不存在")
return None
snapshot = {
"snapshot_info": {
"generated_at": datetime.now().isoformat(),
"base_path": str(base_path),
"total_items": 0,
"total_size": 0,
"total_files": 0,
"total_dirs": 0
},
"items": []
}
# 默认排除模式
if exclude_patterns is None:
exclude_patterns = ['.git', '__pycache__', '.DS_Store', 'node_modules']
try:
for root, dirs, files in os.walk(base_path):
# 排除指定目录
dirs[:] = [d for d in dirs if d not in exclude_patterns]
root_path = Path(root)
# 添加目录信息(跳过根目录)
if root_path != base_path:
dir_info = get_dir_info(root_path, base_path)
snapshot['items'].append(dir_info)
snapshot['snapshot_info']['total_dirs'] += 1
# 添加文件信息
for file in files:
if file in exclude_patterns:
continue
file_path = root_path / file
file_info = get_file_info(file_path, base_path)
if 'error' not in file_info:
snapshot['snapshot_info']['total_size'] += file_info['size']
snapshot['snapshot_info']['total_files'] += 1
snapshot['items'].append(file_info)
snapshot['snapshot_info']['total_items'] = len(snapshot['items'])
# 格式化总大小
snapshot['snapshot_info']['total_size_human'] = format_size(
snapshot['snapshot_info']['total_size']
)
return snapshot
except Exception as e:
print(f"生成快照时出错: {e}")
return None
def save_snapshot(snapshot, output_file, output_format='json'):
"""保存快照到文件"""
if output_format == 'json':
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(snapshot, f, ensure_ascii=False, indent=2)
print(f"快照已保存到: {output_file}")
elif output_format == 'txt':
with open(output_file, 'w', encoding='utf-8') as f:
f.write(f"文件夹快照报告\n")
f.write(f"{'='*60}\n\n")
f.write(f"生成时间: {snapshot['snapshot_info']['generated_at']}\n")
f.write(f"路径: {snapshot['snapshot_info']['base_path']}\n")
f.write(f"总计: {snapshot['snapshot_info']['total_items']} 个项目\n")
f.write(f"文件: {snapshot['snapshot_info']['total_files']} 个\n")
f.write(f"目录: {snapshot['snapshot_info']['total_dirs']} 个\n")
f.write(f"总大小: {snapshot['snapshot_info']['total_size_human']}\n\n")
f.write(f"{'='*60}\n\n")
for item in snapshot['items']:
if item['type'] == 'file':
f.write(f"[文件] {item['path']} ({item['size_human']})\n")
else:
f.write(f"[目录] {item['path']}\n")
print(f"快照统计: 共 {snapshot['snapshot_info']['total_items']} 个项目")
print(f" {snapshot['snapshot_info']['total_files']} 个文件")
print(f" {snapshot['snapshot_info']['total_dirs']} 个目录")
print(f" 总大小: {snapshot['snapshot_info']['total_size_human']}")
def main():
import argparse
parser = argparse.ArgumentParser(description='文件夹快照生成器')
parser.add_argument('directory', help='要扫描的目录路径')
parser.add_argument('-o', '--output', default='snapshot.json',
help='输出文件路径 (默认: snapshot.json)')
parser.add_argument('-f', '--format', choices=['json', 'txt'],
default='json', help='输出格式 (默认: json)')
parser.add_argument('-e', '--exclude', nargs='*',
default=['.git', '__pycache__', '.DS_Store', 'node_modules'],
help='排除的文件/目录名')
args = parser.parse_args()
print(f"正在扫描文件夹: {args.directory}")
snapshot = generate_snapshot(args.directory, args.format, args.exclude)
if snapshot:
save_snapshot(snapshot, args.output, args.format)
if __name__ == "__main__":
main()
Shell脚本版本(Linux/macOS)
#!/bin/bash
# 文件夹快照生成器 - Shell版本
# 默认配置
OUTPUT_FILE="snapshot_$(date +%Y%m%d_%H%M%S).txt"
TARGET_DIR="${1:-.}"
EXCLUDE_PATTERNS=(".git" "__pycache__" ".DS_Store" "node_modules")
print_header() {
echo "========================================"
echo "文件夹快照报告"
echo "========================================"
echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "扫描路径: $(cd "$TARGET_DIR" && pwd)"
echo "========================================"
echo
}
print_tree() {
local dir="$1"
local prefix="$2"
# 获取文件和目录列表
local items=()
while IFS= read -r -d '' item; do
items+=("$item")
done < <(find "$dir" -maxdepth 1 -mindepth 1 -print0 | sort -z)
local count=${#items[@]}
local index=0
for item in "${items[@]}"; do
local name=$(basename "$item")
# 检查是否需要排除
local exclude=false
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
if [[ "$name" == "$pattern" ]]; then
exclude=true
break
fi
done
[[ $exclude == true ]] && continue
((index++))
if [ $index -eq $count ]; then
echo "${prefix}└── $name"
new_prefix="${prefix} "
else
echo "${prefix}├── $name"
new_prefix="${prefix}│ "
fi
if [ -d "$item" ]; then
print_tree "$item" "$new_prefix"
fi
done
}
generate_snapshot() {
{
print_header
# 文件树
echo "文件树结构:"
echo "----------------------------------------"
print_tree "$TARGET_DIR" ""
echo
# 文件统计
echo "文件统计:"
echo "----------------------------------------"
echo "总文件数: $(find "$TARGET_DIR" -type f | wc -l)"
echo "总目录数: $(find "$TARGET_DIR" -type d | wc -l)"
# 计算总大小(排除隐藏目录和macOS的.DS_Store)
local total_size=$(du -sh --exclude='.git' "$TARGET_DIR" 2>/dev/null | cut -f1)
echo "总大小: $total_size"
echo
# 按类型统计
echo "文件类型统计:"
echo "----------------------------------------"
find "$TARGET_DIR" -type f | while read -r file; do
ext="${file##*.}"
echo "$ext"
done | sort | uniq -c | sort -rn | head -20
echo
# 大文件列表
echo "最大的10个文件:"
echo "----------------------------------------"
find "$TARGET_DIR" -type f -exec ls -lh {} \; 2>/dev/null | \
sort -k5 -rh | head -10
echo
# 最新修改的文件
echo "最近修改的10个文件:"
echo "----------------------------------------"
find "$TARGET_DIR" -type f -exec ls -lt {} \; 2>/dev/null | \
head -10
} > "$OUTPUT_FILE"
echo "快照已生成: $OUTPUT_FILE"
cat "$OUTPUT_FILE"
}
# 主程序
if [ ! -d "$TARGET_DIR" ]; then
echo "错误: 目录 $TARGET_DIR 不存在"
exit 1
fi
generate_snapshot
PowerShell版本(Windows)
# Windows文件夹快照生成器 - PowerShell版本
param(
[string]$TargetPath = (Get-Location).Path,
[string]$OutputFile = "snapshot_$((Get-Date).ToString('yyyyMMdd_HHmmss')).txt",
[string[]]$ExcludePatterns = @('.git', '__pycache__', '.DS_Store', 'node_modules', '.vs')
)
function Format-FileSize {
param([long]$bytes)
$sizes = @('B', 'KB', 'MB', 'GB', 'TB')
$index = 0
while ($bytes -ge 1024 -and $index -lt $sizes.Length - 1) {
$bytes /= 1024
$index++
}
return "{0:N2} {1}" -f $bytes, $sizes[$index]
}
function Write-Snapshot {
param(
[string]$Path,
[string]$Indent = ""
)
$items = Get-ChildItem -Path $Path -Force | Where-Object {
$_.Name -notin $ExcludePatterns
} | Sort-Object -Property PSIsContainer, Name
$count = ($items | Measure-Object).Count
$index = 0
foreach ($item in $items) {
$index++
$prefix = if ($index -eq $count) { "└── " } else { "├── " }
$newIndent = if ($index -eq $count) { " " } else { "│ " }
if ($item.PSIsContainer) {
Write-Output "$Indent$prefix[$($item.Name)]"
Write-Snapshot -Path $item.FullName -Indent "$Indent$newIndent"
} else {
$size = Format-FileSize -bytes $item.Length
$modified = $item.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")
Write-Output "$Indent$prefix$($item.Name) ($size, $modified)"
}
}
}
# 主程序
if (-not (Test-Path -Path $TargetPath)) {
Write-Error "错误: 目录 $TargetPath 不存在"
exit 1
}
# 生成快照内容
$content = @"
========================================
文件夹快照报告
========================================
生成时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
扫描路径: $((Resolve-Path $TargetPath).Path)
========================================
文件结构:
----------------------------------------
"@
# 准备写入文件
$content | Out-File -FilePath $OutputFile -Encoding UTF8
# 递归生成文件树
$treeOutput = Write-Snapshot -Path $TargetPath -Indent ""
$treeOutput | Out-File -FilePath $OutputFile -Encoding UTF8 -Append
# 统计信息
$stats = @"
文件统计:
----------------------------------------
总文件数: $(Get-ChildItem -Path $TargetPath -Recurse -File | Where-Object { $_.Name -notin $ExcludePatterns } | Measure-Object | Select-Object -ExpandProperty Count)
总目录数: $(Get-ChildItem -Path $TargetPath -Recurse -Directory | Where-Object { $_.Name -notin $ExcludePatterns } | Measure-Object | Select-Object -ExpandProperty Count)
总大小: $(Format-FileSize -bytes ((Get-ChildItem -Path $TargetPath -Recurse -File | Where-Object { $_.Name -notin $ExcludePatterns } | Measure-Object -Property Length -Sum).Sum))
最近修改的文件:
----------------------------------------
"@
$stats | Out-File -FilePath $OutputFile -Encoding UTF8 -Append
# 列出最近修改的文件
Get-ChildItem -Path $TargetPath -Recurse -File |
Where-Object { $_.Name -notin $ExcludePatterns } |
Sort-Object -Property LastWriteTime -Descending |
Select-Object -First 10 -Property Name, LastWriteTime, Length |
ForEach-Object {
$size = Format-FileSize -bytes $_.Length
"$($_.Name) - $($_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss')) - $size"
} | Out-File -FilePath $OutputFile -Encoding UTF8 -Append
Write-Host "快照已生成: $OutputFile"
使用方法
Python版本
# 基本用法 python snapshot.py /path/to/folder # 指定输出格式和文件 python snapshot.py /path/to/folder -o report.txt -f txt # 自定义排除项 python snapshot.py /path/to/folder -e .git .svn temp_cache
Shell版本
# 设置执行权限 chmod +x snapshot.sh # 基本用法 ./snapshot.sh /path/to/folder # 使用当前目录 ./snapshot.sh
PowerShell版本
# 基本用法 .\snapshot.ps1 -TargetPath "C:\YourFolder" # 使用当前目录 .\snapshot.ps1
功能特点
- 递归扫描:完整展示文件夹结构
- 文件统计:数量、大小、类型分布
- 时间信息:创建时间、修改时间
- 大文件检测:找出占用空间大的文件
- 排除机制:忽略不需要的目录和文件
- 多种格式:支持JSON和TXT格式输出
- 跨平台:支持Windows、Linux、macOS
选择适合您操作系统的版本,根据需求调整配置即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播