当前位置: 首页 > news >正文

【懒人工具】指定新文件,替换全盘旧文件

没辙,就是懒

最近在调整.clang-format,这个format文件要跟着项目走,只换本地默认的还不够。调整好以后一个项目一个项目的换,有时候会漏掉,索性全盘一次性换完。
基于自己操作的流程,写了个脚本,备忘的同时分享一下
用法:

def print_usage():usage = """使用方法:python UpdateAllFile.py 需要替换的文件名 搜索用正则表达式 过滤关键字记录的文件路径在当前路径下找到需要替换的新文件根据everything搜索用的正则表达式在全盘搜索根据过滤关键字记录的文件里面的记录过滤出来需要被替换的文件用当前路径下的新文件替换需要被替换的文件,如果被替换的文件是只读会先改为可读写"""print(usage)

准备1

安装everything

准备2

下载 Everything 命令行接口:es.exe官网链接,exe所在路径下载解压加入path

脚本

import pandas as pd
import os
import shutil
import sys
import subprocessdef load_filters(filter_file):"""从文件加载过滤路径关键字,返回关键字列表"""try:with open(filter_file, 'r') as f:return [line.strip() for line in f if line.strip()]except FileNotFoundError:return []def save_filters(filter_file, filters):"""将过滤路径关键字保存到文件"""with open(filter_file, 'w') as f:for filter_item in filters:f.write(filter_item + '\n')def main(target_src_file,targetfile_regx,filter_file):filters = load_filters(filter_file)  # 从文件加载过滤路径关键字# 通过everything查找所有.clang-format文件try:result = subprocess.run(['es.exe', '-r', targetfile_regx], capture_output=True, text=True, check=True)# 将输出按行分割,并去除空行formatfiles = [line for line in result.stdout.splitlines() if line.strip()]except subprocess.CalledProcessError as e:print(f"执行命令时出错: {e}")returnexcept Exception as e:print(f"发生未知错误: {e}")returnwhile True:# 过滤掉包含指定关键字的文件路径,也排除当前文件formatfiletargets = [file for file in formatfiles if not any(f in file for f in filters) and file != target_src_file]# 打印过滤后的文件列表print("以下是将要被替换的文件:")for file in formatfiletargets:print(file)# 确认confirmation = input("继续 -> 输入 'yes' 或直接按回车\n退出 -> 输入 'no'\n增加新的过滤关键字 -> 输入新的关键字 \n我要 : ")if confirmation.lower() == 'yes' or confirmation == '':breakelif confirmation.lower() == 'no':print("操作已取消。")returnelse:new_filter = confirmation.strip()filters.append(new_filter)print(f"已添加过滤关键字: {new_filter}")# 输出更新后的过滤关键字到文件save_filters(filter_file, filters)# 新文件路径new_file_path = target_src_file# 替换旧文件for formatfile in formatfiletargets:try:# 确保旧文件存在if os.path.exists(formatfile):# 检查旧文件的只读属性if not os.access(formatfile, os.W_OK):# 取消只读属性os.chmod(formatfile, 0o666)  # 设置为可读可写# 替换旧文件为新文件shutil.copy(new_file_path, formatfile)  # 用新文件替换旧文件print(f"已用新文件替换旧文件: {formatfile}")else:print(f"旧文件不存在: {formatfile}")except Exception as e:print(f"处理文件时出错: {e}")def check_pwd_for_file(targetfile):"""检查当前路径下是否存在targetfile文件,存在则返回文件路径,不存在则返回空字符串。"""current_path = os.getcwd()  clang_format_file = os.path.join(current_path, targetfile) if os.path.isfile(clang_format_file):  return clang_format_fileelse:return ""def print_usage():usage = """使用方法:python UpdateAllClangFormat.py 需要替换的文件名 搜索用正则表达式 过滤关键字记录的文件路径在当前路径下找到需要替换的新文件根据搜索用的正则表达式在全盘搜索根据过滤关键字记录的文件里面的记录过滤出来需要被替换的文件用当前路径下的新文件替换需要被替换的文件,如果被替换的文件是只读会先改为可读写"""print(usage)def get_filename_from_path(file_path):return os.path.basename(file_path)if __name__ == "__main__":para_from_cmd = False # 是否从命令行参数中获取参数targetfile = r'.clang-format' # 要查找的文件名targetfile_regx = r'^\.clang-format$' # 正则表达式:匹配要查找的文件名filter_file = r'D:\mybin\format.filter' # 过滤关键字文件if para_from_cmd :# 检查输入的参数if len(sys.argv) != 4 :print_usage()else:targetfile = sys.argv[1]targetfile_regx = sys.argv[1]filter_file = sys.argv[1]target_src_file = check_pwd_for_file(targetfile)if target_src_file != "":print(f"TargetFile          : \"{targetfile}\"")print(f"TargetFile regx str : \"{targetfile_regx}\"")print(f"File under PWD      : \"{target_src_file}\"")# 确认confirmation = input("请确认\n继续 -> 直接按回车\n退出 -> 输入 'no'或'n'\n我要 : ")if confirmation.lower() == 'no' or confirmation.lower() == 'n':print("操作已取消。")exit(0)main(target_src_file,targetfile_regx, filter_file)else:print(f"当前路径没找到{targetfile}")
http://www.lryc.cn/news/427532.html

相关文章:

  • React+Vis.js(02):设置节点样式
  • 3G网络要彻底没了
  • 如何配置ESXI主机的IP地址管理
  • 软件测试学习笔记丨测试用例设计方法
  • MinIO基本用法
  • MySQL windows版本安装
  • Python实现人脸轮廓提取
  • Prettier+Vscode setting提高前端开发效率
  • YOLOv10实时端到端目标检测
  • Java中的Annotation注解
  • 小五金加工:细节决定产品质量与性能
  • VS Code安装配置ssh服务结合内网穿透远程连接本地服务器详细步骤
  • 世界首位「AI科学家」问世!独立生成10篇学术论文! 横扫「顶会」?
  • 【高阶数据结构】图
  • 调研-音视频
  • 【数据结构】链式结构实现:二叉树
  • 20221元组
  • 艾瑞白皮书解读(三)丨剖析制造业、工程设计、创投数据治理痛点与典型方案
  • 如何在 Odoo 16 Studio 模块中自定义视图和报告
  • Redis的十大数据类型的常用命令(上)
  • 智慧服务管理平台小程序开发方案
  • 【轻松拿捏】Java中ArrayList 和 LinkedList 的区别是什么?
  • 【排序篇】快速排序的非递归实现与归并排序的实现
  • Java垃圾收集器工作原理
  • STM32CubeMX stm32不限长度使用DMA收发串口数据
  • Jmeter系列之作用域、执行顺序
  • 舜宇光学科技社招校招入职测评:商业推理测验真题汇总、答题要求、高分技巧
  • C语言——构造(结构体)
  • 京东2025届秋招 算法开发工程师 第2批笔试
  • 模具监视器的技术参数有哪些