需求:
从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)