如何写文件夹遍历脚本

wen 实用脚本 32

本文目录导读:

如何写文件夹遍历脚本

  1. Python 版本(最推荐)
  2. Bash/Shell 版本
  3. Node.js 版本
  4. Java 版本
  5. Windows Batch 版本
  6. 实用功能扩展

Python 版本(最推荐)

基础递归遍历

import os
def traverse_directory(path):
    for root, dirs, files in os.walk(path):
        level = root.replace(path, '').count(os.sep)
        indent = ' ' * 4 * level
        print(f"{indent}{os.path.basename(root)}/")
        sub_indent = ' ' * 4 * (level + 1)
        for file in files:
            print(f"{sub_indent}{file}")
# 使用示例
traverse_directory('/path/to/directory')

高级版本(带过滤和大小统计)

import os
def advanced_traverse(path, file_extensions=None, min_size=None):
    results = []
    for root, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)
            file_size = os.path.getsize(file_path)
            # 文件扩展名过滤
            if file_extensions:
                ext = os.path.splitext(file)[1]
                if ext not in file_extensions:
                    continue
            # 文件大小过滤
            if min_size and file_size < min_size:
                continue
            results.append({
                'path': file_path,
                'size': file_size,
                'modified': os.path.getmtime(file_path)
            })
    return results
# 使用示例
files = advanced_traverse('.', file_extensions=['.py', '.txt'], min_size=1024)
for f in files:
    print(f"路径: {f['path']}, 大小: {f['size']} bytes")

Bash/Shell 版本

递归列出所有文件

#!/bin/bash
# 方法1: 使用 find
find /path/to/directory -type f 2>/dev/null
# 方法2: 树形结构
find /path/to/directory -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
# 方法3: 带文件大小
find /path/to/directory -type f -exec ls -lh {} \;
# 方法4: 只显示文件名和大小
find /path/to/directory -type f -exec sh -c 'echo "{}: $(stat -f%z "{}" 2>/dev/null || stat -c%s "{}")"' \;

Node.js 版本

异步遍历

const fs = require('fs');
const path = require('path');
async function traverseDirectory(dirPath) {
    const files = await fs.promises.readdir(dirPath);
    for (const file of files) {
        const fullPath = path.join(dirPath, file);
        const stat = await fs.promises.stat(fullPath);
        if (stat.isDirectory()) {
            console.log(`📁 ${file}/`);
            await traverseDirectory(fullPath);
        } else {
            console.log(`📄 ${file} (${stat.size} bytes)`);
        }
    }
}
// 使用示例
traverseDirectory('./').catch(console.error);

Java 版本

递归遍历

import java.io.File;
public class DirectoryTraverser {
    public static void traverse(File dir, String indent) {
        File[] files = dir.listFiles();
        if (files == null) return;
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println(indent + "[DIR] " + file.getName());
                traverse(file, indent + "  ");
            } else {
                System.out.println(indent + "[FILE] " + file.getName() + 
                                 " (" + file.length() + " bytes)");
            }
        }
    }
    public static void main(String[] args) {
        traverse(new File("/path/to/directory"), "");
    }
}

Windows Batch 版本

@echo off
:: 递归列出所有文件
dir /s /b "C:\path\to\directory"
:: 树形结构
tree "C:\path\to\directory" /f
:: 带文件大小
for /r "C:\path\to\directory" %%f in (*) do (
    echo %%f - %%~zf bytes
)

实用功能扩展

Python 版本:带进度条和异常处理

import os
import sys
from pathlib import Path
def safe_traverse(path, ignore_errors=True):
    """安全的目录遍历,支持并行和错误处理"""
    results = []
    try:
        path = Path(path)
        for item in path.rglob('*'):
            try:
                if item.is_file():
                    results.append({
                        'name': item.name,
                        'path': str(item),
                        'size': item.stat().st_size,
                        'suffix': item.suffix
                    })
            except PermissionError:
                if not ignore_errors:
                    print(f"权限不足: {item}", file=sys.stderr)
                continue
    except Exception as e:
        print(f"遍历错误: {e}", file=sys.stderr)
    return results
# 使用示例
files = safe_traverse('.')
print(f"共找到 {len(files)} 个文件")

过滤特定模式的版本

import fnmatch
import os
def find_files_by_pattern(root_dir, pattern):
    """按文件名模式查找文件"""
    matches = []
    for root, dirs, files in os.walk(root_dir):
        for filename in fnmatch.filter(files, pattern):
            matches.append(os.path.join(root, filename))
    return matches
# 使用示例
# 查找所有 .log 文件
log_files = find_files_by_pattern('.', '*.log')
print(f"找到 {len(log_files)} 个日志文件")
# 查找 data_2024_*.csv 格式的文件
data_files = find_files_by_pattern('.', 'data_2024_*.csv')

这些脚本可以根据你的具体需求修改,比如添加文件类型过滤、大小限制、递归深度控制等,选择最适合你使用场景的语言和实现方式。

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