使用Python重命名文件时误操作致文件丢失,如何恢复?
如何恢复因重复运行重命名脚本丢失的图片文件?
问题场景
你运行了以下Python脚本批量重命名图片:
import os i = 0 path = os.chdir("/home/saran/Documents/twitter content") for file in os.listdir(path): if file == "rename.py" : continue new_file = "tweet{}.png ".format(i) os.rename(file, new_file) i = i + 1
第一次运行成功,但重复运行后半数图片丢失——原因确实是重名覆盖:第二次运行时脚本从i=0开始命名,会直接覆盖已存在的tweet0.png、tweet1.png等文件,原文件被新的重命名文件替换,导致永久丢失(除非有备份或快照)。
恢复方法
1. 优先使用系统快照/备份
如果你的Linux系统开启了分区快照(比如Btrfs/ZFS的内置快照,或用Timeshift、Snapper这类工具做了定时备份),直接恢复对应目录的快照即可找回文件,这是最可靠的方式。
2. 使用数据恢复工具
如果没有快照,尝试用专业工具找回,但成功率取决于丢失后是否往该分区写入过新数据(写入越多,恢复概率越低):
- 立即停止对
/home/saran/Documents/twitter content所在分区的写入操作,避免覆盖丢失文件的残留数据。 - 安装
testdisk(包含专门恢复图片的photorec工具):# Debian/Ubuntu系 sudo apt install testdisk # RHEL/CentOS系 sudo dnf install testdisk - 运行
photorec:
按照界面提示,选择存储图片的分区,设置扫描范围为“整个分区”,指定恢复的文件类型为图片(勾选PNG等格式),并将恢复的文件保存到另一个分区的目录(不能保存在原分区,避免二次覆盖)。sudo photorec
3. 检查桌面回收站(可能性低)
部分Linux桌面环境的回收站会记录GUI操作的删除,但命令行的os.rename覆盖不属于“删除”操作,所以大概率找不到,但可以快速检查一下。
避免再次出错的改进脚本
为防止重复运行导致覆盖,修改脚本从已存在的最大编号开始递加命名,同时检查目标文件名是否存在:
import os target_dir = "/home/saran/Documents/twitter content" os.chdir(target_dir) # 获取已存在的tweet*.png的最大编号 max_index = 0 for filename in os.listdir(target_dir): if filename.startswith("tweet") and filename.endswith(".png"): try: current_index = int(filename.lstrip("tweet").rstrip(".png")) if current_index > max_index: max_index = current_index except ValueError: # 跳过不符合命名规则的文件 continue # 从最大编号+1开始命名 current_index = max_index + 1 for filename in os.listdir(target_dir): # 跳过脚本自身和已重命名的文件 if filename == "rename.py" or (filename.startswith("tweet") and filename.endswith(".png")): continue new_filename = f"tweet{current_index}.png" # 保险:如果意外出现重名,自动递增编号 while os.path.exists(new_filename): current_index += 1 new_filename = f"tweet{current_index}.png" os.rename(filename, new_filename) current_index += 1
内容的提问来源于stack exchange,提问作者Saran Pariyar
相关产品推荐
相关产品推荐

