AB目录同步问题

奥黛丽·逐爱者
2024-05-14 / 0 评论 / 1 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年05月14日,已超过128天没有更新,若内容或图片失效,请留言反馈。

需求:
从A目录复制数据到B目录,记录复制过的文件并生成详细日志,以后再次执行该脚本就算B目录下的文件被清空,已同步过的文件也不会再次复制。
直接使用bat命令——失败
Linux使用rsync——没成功
问了ChatGPT
要使用这个Python脚本在Windows上从A目录复制数据到B目录,并记录已复制的文件以避免重复复制,请按以下步骤操作:

步骤一:安装Python

如果你还没有安装Python,请先从Python官方网站下载并安装Python。

步骤二:创建脚本文件

1、打开一个文本编辑器(如Notepad、Notepad++或VSCode)。
2、将以下脚本代码复制并粘贴到文本编辑器中。

import os
import shutil
import hashlib

# 定义本地目录A和目标目录B
local_dir = r"C:\path\to\local\A"
target_dir = r"C:\path\to\target\B"
log_file = "synced_files.log"

def calculate_file_hash(file_path):
    """计算文件的SHA-256哈希值"""
    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)
    return sha256_hash.hexdigest()

def load_synced_files(log_file):
    """加载已同步的文件列表"""
    if os.path.exists(log_file):
        with open(log_file, "r") as f:
            return set(line.strip() for line in f)
    return set()

def log_synced_files(log_file, files):
    """记录已同步的文件列表"""
    with open(log_file, "a") as f:
        for file in files:
            f.write(f"{file}\n")

def sync_files(local_dir, target_dir, log_file):
    """同步文件到目标目录,并记录已同步的文件"""
    # 加载已同步文件的列表
    synced_files = load_synced_files(log_file)
    
    # 获取本地目录中所有文件
    all_files = set()
    for root, _, files in os.walk(local_dir):
        for file in files:
            full_path = os.path.join(root, file)
            relative_path = os.path.relpath(full_path, local_dir)
            file_hash = calculate_file_hash(full_path)
            all_files.add((relative_path, file_hash))

    # 需要同步的文件
    files_to_sync = {file for file in all_files if file[1] not in synced_files}

    # 如果没有需要同步的文件,直接返回
    if not files_to_sync:
        print("没有新的文件需要同步。")
        return

    # 同步文件
    for relative_path, file_hash in files_to_sync:
        source_file = os.path.join(local_dir, relative_path)
        target_file = os.path.join(target_dir, relative_path)
        target_dir_path = os.path.dirname(target_file)
        
        # 创建目标目录(如果不存在)
        os.makedirs(target_dir_path, exist_ok=True)
        
        # 复制文件
        shutil.copy2(source_file, target_file)
        
        # 记录同步的文件
        log_synced_files(log_file, [file_hash])

    print(f"同步完成:{len(files_to_sync)} 个文件。")

if __name__ == "__main__":
    sync_files(local_dir, target_dir, log_file)

3、将此文件保存为sync_files.py(文件扩展名为.py)。

步骤三:编辑脚本文件

打开sync_files.py,编辑以下变量以匹配你的目录路径:

local_dir = r"C:\path\to\local\A"  # 替换为你的本地A目录路径
target_dir = r"C:\path\to\target\B"  # 替换为你的目标B目录路径
log_file = "synced_files.log"  # 日志文件的路径和名称
步骤四:运行脚本

1、打开命令提示符(可以通过按下Win + R,然后输入cmd并按回车键来打开)。
2、导航到包含sync_files.py文件的目录。例如,如果文件在桌面上,可以使用以下命令:

cd C:\Users\YourName\Desktop

3、运行脚本:

python sync_files.py
结果

脚本将从本地A目录复制文件到目标B目录,并记录已复制的文件的哈希值到synced_files.log。
下次运行脚本时,它将跳过已记录的文件,避免重复复制,即使B目录中的文件被清空。

注意事项

确保你有足够的权限读取源目录和写入目标目录。
如果脚本没有正确运行,检查目录路径是否正确,以及日志文件synced_files.log是否存在并具有写入权限。

0

评论 (0)

取消