批量修改文件作者信息的脚本

wen 实用脚本 1

本文目录导读:

批量修改文件作者信息的脚本

  1. 综合批量修改脚本(Python)
  2. 安装依赖
  3. 使用方法
  4. Linux/Unix Shell脚本版本
  5. 安装Shell版本依赖
  6. 注意事项

综合批量修改脚本(Python)

#!/usr/bin/env python3
"""
批量修改文件作者信息脚本
支持:Office文档(docx/xlsx/pptx)、PDF、图片(JPEG/PNG)
"""
import os
import sys
import argparse
from pathlib import Path
import subprocess
from datetime import datetime
class FileAuthorModifier:
    def __init__(self, verbose=False):
        self.verbose = verbose
    def modify_office_doc(self, file_path, author, company=None):
        """修改Office文档作者信息"""
        try:
            from docx import Document
            from openpyxl import load_workbook
            from pptx import Presentation
            ext = Path(file_path).suffix.lower()
            if ext == '.docx':
                doc = Document(file_path)
                doc.core_properties.author = author
                if company:
                    doc.core_properties.company = company
                doc.save(file_path)
            elif ext == '.xlsx':
                wb = load_workbook(file_path)
                wb.properties.creator = author
                if company:
                    wb.properties.company = company
                wb.save(file_path)
            elif ext == '.pptx':
                prs = Presentation(file_path)
                prs.core_properties.author = author
                if company:
                    prs.core_properties.company = company
                prs.save(file_path)
            return True
        except Exception as e:
            if self.verbose:
                print(f"修改Office文档失败 {file_path}: {e}")
            return False
    def modify_pdf(self, file_path, author):
        """修改PDF作者信息"""
        try:
            from PyPDF2 import PdfReader, PdfWriter
            reader = PdfReader(file_path)
            writer = PdfWriter()
            # 复制页面
            for page in reader.pages:
                writer.add_page(page)
            # 修改元数据
            metadata = reader.metadata
            if metadata:
                writer.add_metadata({
                    '/Author': author,
                    '/Creator': f'Modified by batch script {datetime.now()}'
                })
            # 保存
            with open(file_path, 'wb') as f:
                writer.write(f)
            return True
        except Exception as e:
            if self.verbose:
                print(f"修改PDF失败 {file_path}: {e}")
            return False
    def modify_image(self, file_path, author):
        """修改图片作者信息"""
        try:
            from PIL import Image
            from PIL.PngImagePlugin import PngInfo
            img = Image.open(file_path)
            if file_path.lower().endswith('.png'):
                # PNG格式
                metadata = PngInfo()
                metadata.add_text('Author', author)
                metadata.add_text('Creator', f'Modified by batch script')
                img.save(file_path, pnginfo=metadata)
            elif file_path.lower().endswith(('.jpg', '.jpeg')):
                # JPEG格式
                exif = img.getexif()
                exif[0x9C9B] = author  # XPAuthor标签
                img.save(file_path, exif=exif)
            return True
        except Exception as e:
            if self.verbose:
                print(f"修改图片失败 {file_path}: {e}")
            return False
    def modify_file(self, file_path, author, company=None):
        """根据文件类型修改作者信息"""
        ext = Path(file_path).suffix.lower()
        if ext in ['.docx', '.xlsx', '.pptx']:
            return self.modify_office_doc(file_path, author, company)
        elif ext == '.pdf':
            return self.modify_pdf(file_path, author)
        elif ext in ['.jpg', '.jpeg', '.png']:
            return self.modify_image(file_path, author)
        else:
            if self.verbose:
                print(f"不支持的文件类型: {file_path}")
            return False
    def batch_modify(self, directory, author, company=None, recursive=False):
        """批量修改目录下的文件"""
        pattern = '**/*' if recursive else '*'
        success_count = 0
        fail_count = 0
        for file_path in Path(directory).glob(pattern):
            if file_path.is_file():
                if self.modify_file(str(file_path), author, company):
                    success_count += 1
                    if self.verbose:
                        print(f"✓ 修改成功: {file_path}")
                else:
                    fail_count += 1
        return success_count, fail_count
def main():
    parser = argparse.ArgumentParser(description='批量修改文件作者信息')
    parser.add_argument('directory', help='要处理的目录路径')
    parser.add_argument('author', help='新的作者名称')
    parser.add_argument('--company', '-c', help='公司名称(仅Office文档)')
    parser.add_argument('--recursive', '-r', action='store_true', help='递归处理子目录')
    parser.add_argument('--verbose', '-v', action='store_true', help='显示详细信息')
    args = parser.parse_args()
    if not Path(args.directory).exists():
        print(f"错误: 目录 '{args.directory}' 不存在")
        sys.exit(1)
    modifier = FileAuthorModifier(verbose=args.verbose)
    print(f"开始处理目录: {args.directory}")
    print(f"设置作者为: {args.author}")
    if args.company:
        print(f"设置公司为: {args.company}")
    success, fail = modifier.batch_modify(
        args.directory, 
        args.author, 
        args.company,
        args.recursive
    )
    print(f"\n处理完成!")
    print(f"成功: {success}")
    print(f"失败: {fail}")
if __name__ == '__main__':
    main()

安装依赖

# 安装必要的Python库
pip install python-docx openpyxl python-pptx PyPDF2 Pillow

使用方法

# 基本用法
python modify_author.py /path/to/files "新作者名"
# 递归处理子目录
python modify_author.py /path/to/files "新作者名" -r
# 指定公司名称(仅Office文档)
python modify_author.py /path/to/files "新作者名" -c "公司名"
# 显示详细信息
python modify_author.py /path/to/files "新作者名" -v

Linux/Unix Shell脚本版本

#!/bin/bash
# 批量修改文件作者信息 (Shell版本)
MODIFY_AUTHOR() {
    local file="$1"
    local author="$2"
    case "${file,,}" in
        *.docx|*.xlsx|*.pptx)
            # Office文档 - 使用python命令
            python3 -c "
from docx import Document
from openpyxl import load_workbook
from pptx import Presentation
import sys
file_path = '$file'
author = '$author'
if file_path.endswith('.docx'):
    doc = Document(file_path)
    doc.core_properties.author = author
    doc.save(file_path)
elif file_path.endswith('.xlsx'):
    wb = load_workbook(file_path)
    wb.properties.creator = author
    wb.save(file_path)
elif file_path.endswith('.pptx'):
    prs = Presentation(file_path)
    prs.core_properties.author = author
    prs.save(file_path)
print(f'Modified: {file_path}')
" 2>/dev/null || echo "跳过: $file (可能需要安装Python库)"
            ;;
        *.pdf)
            # PDF文件
            exiftool -overwrite_original -Author="$author" "$file" 2>/dev/null || \
            pdfinfo "$file" > /dev/null 2>&1 && \
            pdftk "$file" output temp.pdf allow AllFeatures && \
            mv temp.pdf "$file"
            ;;
        *.jpg|*.jpeg|*.png)
            # 图片文件
            exiftool -overwrite_original -Artist="$author" -Author="$author" "$file" 2>/dev/null || \
            echo "需要安装exiftool"
            ;;
        *)
            echo "不支持的文件类型: $file"
            ;;
    esac
}
# 主程序
DIRECTORY="${1:-.}"
AUTHOR="${2:-Unknown}"
echo "开始修改目录: $DIRECTORY"
echo "设置作者为: $AUTHOR"
find "$DIRECTORY" -type f \( -iname "*.docx" -o -iname "*.xlsx" -o -iname "*.pptx" -o -iname "*.pdf" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | while read file; do
    MODIFY_AUTHOR "$file" "$AUTHOR"
done
echo "完成!"

安装Shell版本依赖

# Ubuntu/Debian
sudo apt-get install exiftool pdftk python3-docx python3-openpyxl python3-pptx
# CentOS/RHEL
sudo yum install exiftool pdftk python3-docx python3-openpyxl python3-pptx

注意事项

  1. 备份文件: 修改前建议备份重要文件
  2. 权限问题: 确保有文件写入权限
  3. 文件锁定: 确保文件未被其他程序占用
  4. 编码问题: 中文作者名可能需要UTF-8编码支持
  5. 性能考虑: 大量文件处理可能需要较长时间

这个脚本支持多种常见文件格式,可以根据需要扩展支持更多文件类型。

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