如何编写按名称检索本地文件脚本

wen 实用脚本 36

本文目录导读:

如何编写按名称检索本地文件脚本

  1. Windows PowerShell 脚本
  2. Linux/macOS Shell 脚本(bash)
  3. Python 跨平台脚本(推荐)
  4. 增强版 Python 脚本(带 GUI)
  5. 使用建议

Windows PowerShell 脚本

# find-file.ps1
param(
    [Parameter(Mandatory=$true)]
    [string]$FileName,
    [string]$SearchPath = "C:\",
    [switch]$Recurse = $true
)
Write-Host "搜索文件: $FileName" -ForegroundColor Green
Write-Host "搜索路径: $SearchPath" -ForegroundColor Green
$results = Get-ChildItem -Path $SearchPath -Filter "*$FileName*" -Recurse:$Recurse -ErrorAction SilentlyContinue
if ($results.Count -gt 0) {
    Write-Host "找到 $($results.Count) 个文件:" -ForegroundColor Cyan
    $results | Select-Object FullName, Length, LastWriteTime | Format-Table -AutoSize
} else {
    Write-Host "未找到匹配的文件。" -ForegroundColor Yellow
}

使用方式:

.\find-file.ps1 -FileName "report" -SearchPath "D:\Documents"

Linux/macOS Shell 脚本(bash)

#!/bin/bash
# find-file.sh
usage() {
    echo "用法: $0 -n <文件名> [-p <搜索路径>]"
    echo "  -n  文件名(支持通配符)"
    echo "  -p  搜索路径(默认当前目录)"
    exit 1
}
# 默认值
SEARCH_PATH="."
FILE_NAME=""
# 解析参数
while getopts "n:p:" opt; do
    case $opt in
        n) FILE_NAME="$OPTARG" ;;
        p) SEARCH_PATH="$OPTARG" ;;
        *) usage ;;
    esac
done
# 检查文件名参数
if [ -z "$FILE_NAME" ]; then
    echo "错误: 必须指定文件名"
    usage
fi
echo "搜索文件: $FILE_NAME"
echo "搜索路径: $SEARCH_PATH"
# 使用 find 命令搜索
find "$SEARCH_PATH" -type f -name "*${FILE_NAME}*" 2>/dev/null | while read -r file; do
    # 获取文件信息
    size=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
    modified=$(stat -c%y "$file" 2>/dev/null || stat -f%Sm "$file" 2>/dev/null)
    echo "找到: $file (大小: $size 字节, 修改时间: $modified)"
done
# 显示计数
count=$(find "$SEARCH_PATH" -type f -name "*${FILE_NAME}*" 2>/dev/null | wc -l)
echo "共找到 $count 个文件"

使用方式:

chmod +x find-file.sh
./find-file.sh -n "report" -p "/home/user/documents"

Python 跨平台脚本(推荐)

#!/usr/bin/env python3
# find_file.py
import os
import sys
import argparse
from pathlib import Path
import fnmatch
def search_files(search_path, file_pattern, case_sensitive=False):
    """按文件名模式搜索文件"""
    results = []
    search_path = Path(search_path)
    if not search_path.exists():
        print(f"错误: 路径 '{search_path}' 不存在")
        return results
    for root, dirs, files in os.walk(search_path):
        for filename in files:
            if case_sensitive:
                if fnmatch.fnmatch(filename, file_pattern):
                    results.append(os.path.join(root, filename))
            else:
                if fnmatch.fnmatch(filename.lower(), file_pattern.lower()):
                    results.append(os.path.join(root, filename))
    return results
def format_size(size_bytes):
    """格式化文件大小"""
    for unit in ['B', 'KB', 'MB', 'GB']:
        if size_bytes < 1024:
            return f"{size_bytes:.1f} {unit}"
        size_bytes /= 1024
    return f"{size_bytes:.1f} TB"
def main():
    parser = argparse.ArgumentParser(description='按名称检索本地文件')
    parser.add_argument('-n', '--name', required=True, help='文件名(支持通配符 * 和 ?)')
    parser.add_argument('-p', '--path', default='.', help='搜索路径(默认当前目录)')
    parser.add_argument('-c', '--case-sensitive', action='store_true', help='区分大小写')
    parser.add_argument('--max-results', type=int, default=0, help='最大显示结果数(0表示全部)')
    args = parser.parse_args()
    print(f"正在搜索: {args.name}")
    print(f"搜索路径: {os.path.abspath(args.path)}")
    print("-" * 50)
    # 执行搜索
    results = search_files(args.path, args.name, args.case_sensitive)
    if not results:
        print("未找到匹配的文件。")
        return
    # 限制显示数量
    display_results = results[:args.max_results] if args.max_results > 0 else results
    for filepath in display_results:
        try:
            stat_info = os.stat(filepath)
            size = format_size(stat_info.st_size)
            modified = datetime.fromtimestamp(stat_info.st_mtime).strftime('%Y-%m-%d %H:%M')
            print(f"📄 {filepath}")
            print(f"   大小: {size} | 修改时间: {modified}")
        except:
            print(f"📄 {filepath}")
    if args.max_results > 0 and len(results) > args.max_results:
        print(f"\n... 还有 {len(results) - args.max_results} 个结果未显示")
    print(f"\n共找到 {len(results)} 个文件")
if __name__ == "__main__":
    from datetime import datetime
    main()

使用方式:

# 基本搜索
python find_file.py -n "*.txt" -p "/home/user"
# 不区分大小写搜索
python find_file.py -n "report" -p "D:\Documents"
# 显示前10个结果
python find_file.py -n "*.pdf" -p "C:\Users" --max-results 10

增强版 Python 脚本(带 GUI)

如果需要图形界面,可以使用 tkinter

import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import os
from pathlib import Path
import fnmatch
class FileSearchGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("文件搜索工具")
        self.root.geometry("700x500")
        # 创建界面元素
        self.setup_ui()
    def setup_ui(self):
        # 搜索设置区域
        frame = ttk.LabelFrame(self.root, text="搜索设置", padding=10)
        frame.pack(fill="x", padx=10, pady=5)
        # 文件名
        ttk.Label(frame, text="文件名:").grid(row=0, column=0, sticky="w")
        self.name_entry = ttk.Entry(frame, width=30)
        self.name_entry.grid(row=0, column=1, padx=5, sticky="we")
        ttk.Label(frame, text="(支持 * 和 ? 通配符)").grid(row=0, column=2, sticky="w")
        # 搜索路径
        ttk.Label(frame, text="搜索路径:").grid(row=1, column=0, sticky="w", pady=5)
        self.path_var = tk.StringVar(value=os.getcwd())
        self.path_entry = ttk.Entry(frame, textvariable=self.path_var, width=50)
        self.path_entry.grid(row=1, column=1, padx=5, pady=5, sticky="we")
        ttk.Button(frame, text="浏览...", command=self.browse_folder).grid(row=1, column=2)
        # 搜索按钮
        button_frame = ttk.Frame(self.root)
        button_frame.pack(fill="x", padx=10, pady=5)
        ttk.Button(button_frame, text="开始搜索", command=self.search_files).pack(side="left", padx=5)
        ttk.Button(button_frame, text="清空结果", command=self.clear_results).pack(side="left")
        self.status_label = ttk.Label(button_frame, text="")
        self.status_label.pack(side="right")
        # 结果显示区域
        result_frame = ttk.LabelFrame(self.root, text="搜索结果", padding=5)
        result_frame.pack(fill="both", expand=True, padx=10, pady=5)
        # 创建树形视图
        columns = ("文件名", "路径", "大小", "修改时间")
        self.tree = ttk.Treeview(result_frame, columns=columns, show="headings", height=15)
        # 设置列
        self.tree.heading("文件名", text="文件名")
        self.tree.heading("路径", text="路径")
        self.tree.heading("大小", text="大小")
        self.tree.heading("修改时间", text="修改时间")
        self.tree.column("文件名", width=150)
        self.tree.column("路径", width=300)
        self.tree.column("大小", width=80)
        self.tree.column("修改时间", width=150)
        # 滚动条
        scrollbar = ttk.Scrollbar(result_frame, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        self.tree.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")
    def browse_folder(self):
        folder = filedialog.askdirectory(initialdir=self.path_var.get())
        if folder:
            self.path_var.set(folder)
    def format_size(self, size):
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size < 1024:
                return f"{size:.1f} {unit}"
            size /= 1024
        return f"{size:.1f} TB"
    def search_files(self):
        pattern = self.name_entry.get().strip()
        search_path = self.path_var.get().strip()
        if not pattern:
            messagebox.showwarning("警告", "请输入文件名")
            return
        # 清空之前的结果
        self.clear_results()
        self.status_label.config(text="正在搜索...")
        self.root.update()
        count = 0
        try:
            for root, dirs, files in os.walk(search_path):
                for filename in files:
                    if fnmatch.fnmatch(filename, pattern):
                        filepath = os.path.join(root, filename)
                        try:
                            stat = os.stat(filepath)
                            size = self.format_size(stat.st_size)
                            from datetime import datetime
                            modified = datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M')
                            self.tree.insert("", "end", values=(
                                filename,
                                root,
                                size,
                                modified
                            ))
                            count += 1
                        except:
                            continue
        except Exception as e:
            messagebox.showerror("错误", f"搜索过程中发生错误: {str(e)}")
        self.status_label.config(text=f"搜索完成,找到 {count} 个文件")
    def clear_results(self):
        self.tree.delete(*self.tree.get_children())
        self.status_label.config(text="")
if __name__ == "__main__":
    root = tk.Tk()
    app = FileSearchGUI(root)
    root.mainloop()

使用建议

  1. 命令行快速搜索:使用 PowerShell(Windows)或 Shell(Linux/macOS)
  2. 跨平台开发:使用 Python 版本,可在任何操作系统运行
  3. 日常使用:GUI 版本(Python tkinter)适合不熟悉命令行的用户
  4. 高级功能:可以扩展 Python 版本,添加正则表达式搜索、文件内容搜索等功能

这些脚本都支持通配符搜索(如 *.txtreport*),可以根据实际需求选择合适的版本。

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