如何在Bash中通过CSV文件删除目录中的指定文件
针对你要批量删除匹配指定唯一ID的图片文件需求,这里给你整理了几种不同平台的实用方案,你可以根据自己的操作系统选择:
一、Linux/macOS 终端(Shell 脚本)
不管你的CSV是空格分隔还是分号分隔,都能轻松处理:
空格分隔的CSV文件
直接读取文件里的ID,循环删除对应前缀的所有图片:# 读取ID并批量删除,-v参数会显示删除的文件 while read -r id; do rm -v "${id}-"*.jpeg done < ids_to_delete.csv分号分隔的CSV文件
先把分号换成换行,再执行删除操作:tr ';' '\n' < ids_to_delete.csv | while read -r id; do rm -v "${id}-"*.jpeg done
💡 小提示:如果怕误删,可以先把
rm -v换成echo rm -v,这样只会预览要删除的文件列表,不会实际执行删除;要是CSV里有空行,就加个grep -v "^$"过滤掉,比如:grep -v "^$" ids_to_delete.csv | while read -r id; do rm -v "${id}-"*.jpeg; done
二、Windows PowerShell
适配两种CSV格式的PowerShell脚本:
空格分隔的CSV文件
# 读取文件并拆分出所有有效ID,循环删除匹配文件 $ids = (Get-Content .\ids_to_delete.csv) -split '\s+' | Where-Object { $_ -ne '' } foreach ($id in $ids) { Remove-Item -Path "${id}-*.jpeg" -Verbose }分号分隔的CSV文件
$ids = (Get-Content .\ids_to_delete.csv) -split ';' | Where-Object { $_ -ne '' } foreach ($id in $ids) { Remove-Item -Path "${id}-*.jpeg" -Verbose }
💡 小提示:
-Verbose参数会显示每一步删除的文件;测试阶段可以把Remove-Item换成Get-ChildItem,先查看要删除的文件列表是否正确。
三、Python 脚本(跨平台通用)
如果处理60万+文件想要更稳定的性能,或者需要额外逻辑校验,Python脚本是不错的选择:
import os def delete_matching_images(img_dir, csv_path, delimiter=None): # 读取CSV文件内容 with open(csv_path, 'r', encoding='utf-8') as f: content = f.read().strip() # 根据分隔符拆分出所有唯一ID if delimiter == ';': id_list = content.split(';') else: # 默认按空格/换行拆分 id_list = content.split() # 过滤空字符串,确保每个ID都是有效内容 valid_ids = [id_str.strip() for id_str in id_list if id_str.strip()] # 遍历图片目录,删除匹配的文件 for filename in os.listdir(img_dir): if filename.endswith('.jpeg'): # 从文件名中提取唯一ID部分 file_unique_id = filename.split('-')[0] if file_unique_id in valid_ids: full_path = os.path.join(img_dir, filename) os.remove(full_path) print(f"已删除: {full_path}") # 替换成你自己的图片目录和CSV文件路径 if __name__ == "__main__": IMAGE_FOLDER = "/Users/xxx/your-image-folder" # Windows路径类似 "C:\\Users\\xxx\\your-image-folder" CSV_FILE = "/Users/xxx/ids_to_delete.csv" # 如果是分号分隔的CSV,就把delimiter设为';',否则留空 delete_matching_images(IMAGE_FOLDER, CSV_FILE, delimiter=None)
💡 小提示:测试时可以把
os.remove(full_path)改成print(f"待删除: {full_path}"),先确认要删除的文件范围;如果图片目录有子文件夹,只需把os.listdir换成os.walk实现递归遍历即可。
重要提醒
操作前一定要备份好重要文件,或者先执行测试命令确认删除范围,避免误删数据!
内容的提问来源于stack exchange,提问作者imgnx
相关产品推荐
相关产品推荐

