网站关键词优化排名外包,网架厂家,wordpress 主机什么系统,什么是电商平台推广1. 为什么你需要这个脚本#xff1f;一个摄影师的真实痛点 拍完照回来#xff0c;看着电脑里堆积如山的照片#xff0c;你是不是也经历过这种纠结#xff1f;相机里导出来的#xff0c;通常是一对“双胞胎”#xff1a;一个JPG文件#xff0c;一个RAW文件。JPG是相机帮…1. 为什么你需要这个脚本一个摄影师的真实痛点拍完照回来看着电脑里堆积如山的照片你是不是也经历过这种纠结相机里导出来的通常是一对“双胞胎”一个JPG文件一个RAW文件。JPG是相机帮你处理好的“快餐”直出就能看RAW则是未经加工的“食材”保留了所有的原始数据后期空间巨大。对于认真创作的朋友RAW肯定是首选但问题也随之而来。我自己的习惯是先快速浏览一遍JPG把明显拍糊了的、构图失败的、表情奇怪的“废片”直接删掉。这个过程很快因为JPG加载迅速一眼就能判断。但删完JPG麻烦就来了旁边那个同名的RAW文件还静静地躺在文件夹里占用着巨大的硬盘空间。一个RAW文件动辄几十MB对于尼康用户是.NEF佳能用户是.CR2或.CR3索尼用户是.ARW。一次拍摄下来几百个RAW文件如果其中一半的JPG都被你淘汰了那这些对应的RAW就成了纯粹的“硬盘杀手”。手动去RAW文件夹里一个个找对应的文件删除那简直是噩梦。文件名可能是一长串数字你得在两个文件夹之间来回切换、比对眼睛看花了不说还极易出错一不小心把还有用的RAW给删了那真是欲哭无泪。这个痛点困扰了我很久直到我开始琢磨用批处理脚本来解决。今天要分享的就是我自己用了好几年的“懒人神器”——一个基于JPG参考自动清理冗余RAW文件的批处理脚本。它的核心思想特别简单让电脑去干那些重复、枯燥的比对工作。你只需要整理好文件夹运行一下脚本它就能自动找出那些“落了单”的RAW文件并帮你清理掉省时省力还安全。2. 脚本核心逻辑拆解它到底是怎么“思考”的别看这个脚本代码不长里面的逻辑却非常清晰就像一个尽职尽责的小助理。我们把它的大脑拆开看看理解了原理用起来才更放心。整个脚本的工作流程可以概括为四个核心步骤收集名单、交叉比对、列出清单、执行清理。我们结合生活场景来理解一下。想象一下你是一名班主任手上有两份名单一份是今天实际来上课的学生名单JPG文件列表另一份是全班的学籍名单RAW文件列表。你的任务是找出那些学籍在册但今天没来上课的学生冗余的RAW文件。脚本干的就是这个活儿。第一步收集名单。脚本会分别进入JPG和NEF或其他RAW格式文件夹读取里面所有指定后缀的文件。关键的一步是它只记录文件的“核心名”也就是去掉.jpg或.nef后缀的那部分。比如DSC_1234.jpg和DSC_1234.nef在脚本眼里它们的核心名都是DSC_1234。这样我们就得到了两个纯净的名单数组。第二步交叉比对。这是最核心的逻辑。脚本会拿着RAW名单学籍名单里的每一个名字去JPG名单上课名单里逐一查找。这个过程在编程里叫“嵌套循环”。如果在JPG名单里找到了同名项那就说明这个RAW文件有对应的JPG是“有用”的文件应该保留。如果找遍了JPG名单都没找到那这个RAW文件就被标记为“冗余”的。第三步列出清单请求确认。脚本非常谨慎它不会直接开删。找到所有冗余文件后它会先把这些文件的完整名带后缀一个一个打印在屏幕上告诉你“嘿我找到了这些可能不需要的文件你看看对不对” 同时它还会再次向你确认“确定要删除吗输入1继续输入其他字符取消。” 这给了你最后一道安全检查的机会你可以快速扫一眼列表防止误删。第四步执行清理。只有在你明确输入“1”确认后脚本才会真正动手。它会进入NEF文件夹精确地删除清单上的每一个文件。并且它会实时显示删除进度让你清楚知道进行到哪一步了。全部完成后会给出一个总结报告。这个“先比对再清单后确认才删除”的流程最大程度地保障了操作的安全性。它完全基于文件名匹配不涉及任何图像内容分析因此速度极快哪怕处理上万张照片也就是几秒钟的事情。3. Windows实战手把手教你配置与运行.bat脚本理论懂了咱们就来真刀真枪地操作一遍。我会以Windows平台最常用的批处理文件.bat为例带你从头到尾走一遍。别怕跟着我的步骤绝对能成。首先你需要整理你的照片文件夹。假设你的照片都放在D:\2024-05-XX拍摄这个目录下。我强烈建议你采用这样的结构在这个目录下直接建立两个文件夹一个叫JPG一个叫NEF如果你的RAW是CR2文件夹名就叫CR2。然后把所有的JPG文件拖进JPG文件夹所有的NEF文件拖进NEF文件夹。记住文件夹的名字必须和里面文件的后缀名扩展名完全一致包括大小写。这是脚本能正确工作的前提。接下来创建脚本文件。在D:\2024-05-XX拍摄这个目录下也就是和JPG、NEF文件夹同级的位置右键新建一个文本文档把它重命名为清理冗余RAW.bat。注意如果系统隐藏了已知文件类型的扩展名你可能需要先在文件夹选项里取消隐藏才能把.txt改成.bat。然后右键这个.bat文件选择“编辑”。把下面这段代码完整地复制粘贴进去。这里我提供的是一个增强版增加了更多的错误检查和提示echo off chcp 65001 nul title 冗余RAW文件清理工具 echo echo 基于JPG参考的冗余RAW清理脚本 echo echo. :: ############### 配置区 ############### :: 请根据你的实际情况修改下面两个变量 :: 要删除的RAW文件所在的文件夹名必须和文件后缀一致 set DEL_SUFFIXNEF :: 作为参考的JPG文件所在的文件夹名必须和文件后缀一致 set REF_SUFFIXJPG :: ############### 配置区结束 ########## set DEL_DIR.\%DEL_SUFFIX%\*.%DEL_SUFFIX% set REF_DIR.\%REF_SUFFIX%\*.%REF_SUFFIX% echo [信息] 当前配置 echo 参考文件夹%REF_SUFFIX% (.%REF_SUFFIX%文件) echo 清理文件夹%DEL_SUFFIX% (.%DEL_SUFFIX%文件) echo. :: 检查文件夹是否存在 if not exist .\%REF_SUFFIX%\ ( echo [错误] 找不到参考文件夹.\%REF_SUFFIX%\ echo 请确保在与本脚本相同的目录下存在名为 %REF_SUFFIX% 的文件夹。 goto :pause_exit ) if not exist .\%DEL_SUFFIX%\ ( echo [错误] 找不到待清理文件夹.\%DEL_SUFFIX%\ echo 请确保在与本脚本相同的目录下存在名为 %DEL_SUFFIX% 的文件夹。 goto :pause_exit ) echo [提示] 脚本将以 %REF_SUFFIX% 文件夹为基准查找并删除 %DEL_SUFFIX% 文件夹中无对应同名文件的冗余文件。 echo 操作前请务必确认已备份重要数据 echo. setlocal enabledelayedexpansion :: 收集参考文件列表仅文件名无后缀 set ref_count0 for /f delims %%m in (dir /b /a-d %REF_DIR% 2^nul) do ( set name%%~nm set ref_[!ref_count!]!name! set /a ref_count1 ) if !ref_count! equ 0 ( echo [警告] 参考文件夹 %REF_SUFFIX% 中没有找到任何 .%REF_SUFFIX% 文件。 goto :pause_exit ) echo [信息] 参考文件夹中共有 !ref_count! 个 .%REF_SUFFIX% 文件。 :: 收集待清理文件列表仅文件名无后缀 set del_count0 for /f delims %%m in (dir /b /a-d %DEL_DIR% 2^nul) do ( set name%%~nm set del_[!del_count!]!name! set /a del_count1 ) if !del_count! equ 0 ( echo [信息] 待清理文件夹 %DEL_SUFFIX% 中没有找到任何 .%DEL_SUFFIX% 文件。无需操作。 goto :pause_exit ) echo [信息] 待清理文件夹中共有 !del_count! 个 .%DEL_SUFFIX% 文件。 echo. :: 用户第一次确认 set /p confirm_step1是否开始分析比对(输入 Y 继续输入其他任意键退出): if /i not !confirm_step1!Y ( echo 操作已取消。 goto :pause_exit ) echo. echo [状态] 正在分析比对请稍候... set to_delete_count0 :: 核心比对逻辑 for /l %%i in (0,1,!del_count!) do ( set current_del!del_[%%i]! set found_match0 for /l %%j in (0,1,!ref_count!) do ( if !current_del!!ref_[%%j]! ( set found_match1 goto :break_inner ) ) :break_inner if !found_match! equ 0 ( set to_delete_[!to_delete_count!]!current_del!.!DEL_SUFFIX! set /a to_delete_count1 ) ) echo [状态] 分析完成 echo. if !to_delete_count! equ 0 ( echo [结果] 恭喜所有 .%DEL_SUFFIX% 文件都有对应的 .%REF_SUFFIX% 文件无需删除。 goto :pause_exit ) echo [结果] 共找到 !to_delete_count! 个冗余的 .%DEL_SUFFIX% 文件。 echo. echo 即将删除的文件列表 echo -------------------------- for /l %%i in (0,1,!to_delete_count!) do ( echo !to_delete_[%%i]! ) echo -------------------------- echo. :: 用户最终确认非常重要 set /p confirm_delete请仔细核对上方列表确认删除请输入 DELETE 并回车输入其他内容取消: if /i not !confirm_delete!DELETE ( echo 操作已取消。未删除任何文件。 goto :pause_exit ) echo. echo 开始删除文件 set deleted_count0 for /l %%i in (0,1,!to_delete_count!) do ( del /f /q .\%DEL_SUFFIX%\!to_delete_[%%i]! nul 21 if exist .\%DEL_SUFFIX%\!to_delete_[%%i]! ( echo [失败] 文件删除失败: !to_delete_[%%i]! ) else ( set /a deleted_count1 set /a progressdeleted_count*100/to_delete_count echo [进度] 已删除: !to_delete_[%%i]! (!deleted_count!/!to_delete_count! ^| !progress!%%) ) ) echo 删除操作结束 echo. echo [总结] 清理完成。成功删除了 !deleted_count! 个冗余的 .%DEL_SUFFIX% 文件。 echo 释放了宝贵的磁盘空间。 :pause_exit echo. pause保存并关闭编辑器。现在双击运行清理冗余RAW.bat。脚本会以命令行窗口打开并引导你一步步操作。你会先看到配置信息然后脚本会检查文件夹、统计文件数量。在关键的分析和删除步骤前它都会停下来等你确认。尤其是删除前它会列出所有待删文件并要求你输入大写的DELETE来最终确认这给了你充足的反悔时间。注意第一次运行时如果系统弹出“Windows已保护你的电脑”的提示点击“更多信息”然后选择“仍要运行”即可。这是因为.bat文件被视为可执行脚本。4. macOS/Linux用户看过来功能相同的.sh脚本苹果电脑或者使用Linux系统的朋友别着急同样的功能我们用Shell脚本.sh一样可以实现而且逻辑几乎一模一样。在macOS上我们通常使用“终端”来运行.sh脚本。首先照片文件夹的整理规则和Windows一样在一个总目录下建立JPG和NEF或CR2等两个子文件夹分别放入对应文件。然后打开“终端”可以在“应用程序”-“实用工具”里找到。使用cd命令切换到你的照片总目录。例如如果你的目录在桌面上叫PhotoClean可以输入cd ~/Desktop/PhotoClean接着创建脚本文件。在终端里输入nano clean_raw.sh这会打开一个名为nano的文本编辑器。把下面的脚本代码粘贴进去#!/bin/bash # # 基于JPG参考的冗余RAW清理脚本 (macOS/Linux) # echo echo echo 基于JPG参考的冗余RAW清理脚本 echo echo # ############### 配置区 ############### # 请根据你的实际情况修改下面两个变量 # 要删除的RAW文件所在的文件夹名必须和文件后缀一致 DEL_SUFFIXNEF # 作为参考的JPG文件所在的文件夹名必须和文件后缀一致 REF_SUFFIXJPG # ############### 配置区结束 ########## DEL_DIR./$DEL_SUFFIX/*.$DEL_SUFFIX REF_DIR./$REF_SUFFIX/*.$REF_SUFFIX echo [信息] 当前配置 echo 参考文件夹$REF_SUFFIX (.${REF_SUFFIX}文件) echo 清理文件夹$DEL_SUFFIX (.${DEL_SUFFIX}文件) echo # 检查文件夹是否存在 if [ ! -d ./$REF_SUFFIX ]; then echo [错误] 找不到参考文件夹./$REF_SUFFIX echo 请确保在与本脚本相同的目录下存在名为 \$REF_SUFFIX\ 的文件夹。 exit 1 fi if [ ! -d ./$DEL_SUFFIX ]; then echo [错误] 找不到待清理文件夹./$DEL_SUFFIX echo 请确保在与本脚本相同的目录下存在名为 \$DEL_SUFFIX\ 的文件夹。 exit 1 fi echo [提示] 脚本将以 \$REF_SUFFIX\ 文件夹为基准查找并删除 \$DEL_SUFFIX\ 文件夹中无对应同名文件的冗余文件。 echo 操作前请务必确认已备份重要数据 echo # 收集参考文件列表仅文件名无后缀 ref_files() if ls $REF_DIR 1 /dev/null 21; then for file in $REF_DIR; do if [ -f $file ]; then filename$(basename $file .$REF_SUFFIX) ref_files($filename) fi done else echo [警告] 参考文件夹 \$REF_SUFFIX\ 中没有找到任何 .$REF_SUFFIX 文件。 exit 1 fi ref_count${#ref_files[]} echo [信息] 参考文件夹中共有 $ref_count 个 .$REF_SUFFIX 文件。 # 收集待清理文件列表仅文件名无后缀 del_files() if ls $DEL_DIR 1 /dev/null 21; then for file in $DEL_DIR; do if [ -f $file ]; then filename$(basename $file .$DEL_SUFFIX) del_files($filename) fi done else echo [信息] 待清理文件夹 \$DEL_SUFFIX\ 中没有找到任何 .$DEL_SUFFIX 文件。无需操作。 exit 0 fi del_count${#del_files[]} echo [信息] 待清理文件夹中共有 $del_count 个 .$DEL_SUFFIX 文件。 echo # 用户第一次确认 read -p 是否开始分析比对(输入 Y 继续输入其他任意键退出): confirm_step1 if [[ ! $confirm_step1 ~ ^[Yy]$ ]]; then echo 操作已取消。 exit 0 fi echo echo [状态] 正在分析比对请稍候... to_delete() to_delete_count0 # 核心比对逻辑 for del_file in ${del_files[]}; do found_match0 for ref_file in ${ref_files[]}; do if [ $del_file $ref_file ]; then found_match1 break fi done if [ $found_match -eq 0 ]; then to_delete($del_file.$DEL_SUFFIX) ((to_delete_count)) fi done echo [状态] 分析完成 echo if [ $to_delete_count -eq 0 ]; then echo [结果] 恭喜所有 .$DEL_SUFFIX 文件都有对应的 .$REF_SUFFIX 文件无需删除。 exit 0 fi echo [结果] 共找到 $to_delete_count 个冗余的 .$DEL_SUFFIX 文件。 echo echo 即将删除的文件列表 echo -------------------------- for file in ${to_delete[]}; do echo $file done echo -------------------------- echo # 用户最终确认非常重要 read -p 请仔细核对上方列表确认删除请输入 DELETE 并回车输入其他内容取消: confirm_delete if [ $confirm_delete ! DELETE ]; then echo 操作已取消。未删除任何文件。 exit 0 fi echo echo 开始删除文件 deleted_count0 for file in ${to_delete[]}; do rm -f ./$DEL_SUFFIX/$file if [ $? -eq 0 ]; then ((deleted_count)) progress$((deleted_count * 100 / to_delete_count)) echo [进度] 已删除: $file ($deleted_count/$to_delete_count | ${progress}%) else echo [失败] 文件删除失败: $file fi done echo 删除操作结束 echo echo [总结] 清理完成。成功删除了 $deleted_count 个冗余的 .$DEL_SUFFIX 文件。 echo 释放了宝贵的磁盘空间。 echo read -p 按回车键退出...粘贴完成后按Ctrl O字母O保存再按Ctrl X退出nano编辑器。最后给脚本加上可执行权限并运行它chmod x clean_raw.sh ./clean_raw.sh之后的操作就和Windows版本类似了脚本会交互式地引导你完成整个过程。macOS系统对脚本的安全限制可能更严格如果遇到权限问题可以尝试在“系统设置”-“隐私与安全性”中允许运行。5. 进阶技巧与避坑指南让你的脚本更强大、更安全掌握了基础用法咱们再来点进阶的让这个脚本更好地为你服务同时避开那些我踩过的坑。1. 灵活适配不同相机品牌脚本的核心是文件夹名和后缀名匹配。你完全可以自定义。比如你用佳能相机RAW是.CR3那么就把脚本配置区的DEL_SUFFIX改成CR3同时把存放RAW的文件夹也重命名为CR3。索尼用户就改成ARW富士用户改成RAF以此类推。JPG参考文件夹同理如果你导出的是.PNG或者.TIFF就把REF_SUFFIX和文件夹名改成对应的。2. 处理带空格或特殊字符的文件名这是早期版本脚本的一个大坑。如果文件名里有空格比如IMG 0001.nef旧的for循环可能会把它拆成两个部分。我上面提供的增强版脚本已经通过使用delims和用引号包裹文件路径解决了这个问题。但为了万无一失我建议在前期整理照片时就用一些重命名工具比如Adobe Bridge、Lightroom或者免费的Advanced Renamer把文件名中的空格替换成下划线_或连字符-这样能避免很多潜在的脚本兼容性问题。3. 一定要先备份或者使用“模拟删除”模式对于任何删除操作备份都是金科玉律。在运行脚本前最简单的备份方法就是把整个RAW文件夹复制一份到其他地方。或者你可以先修改脚本进行“模拟运行”。在.bat脚本中把删除命令del /f /q .\%DEL_SUFFIX%\!to_delete_[%%i]!前面加上echo变成echo del /f /q .\%DEL_SUFFIX%\!to_delete_[%%i]!。这样运行时它只会显示将要执行什么删除命令而不会真正删除文件。在.sh脚本中可以把rm -f改成echo rm -f。用这个“演习”模式跑一遍确认列表完全正确后再去掉echo进行真实操作。4. 应对嵌套文件夹结构我们的脚本默认只处理一级目录。如果你的JPG或NEF文件夹里还有按日期分类的子文件夹脚本就无能为力了。对于这种情况你有两个选择一是先用文件管理软件把所有子文件夹里的文件都“平铺”到一级目录下运行脚本清理后再重新分类比较麻烦。二是修改脚本让它支持递归遍历子文件夹。这需要更复杂的命令比如在for循环中使用/r参数Windows或find命令macOS/Linux。这对于新手来说有点难度我建议先从简单的单层文件夹用起需求强烈时再考虑升级脚本。5. 理解“同名”的局限脚本只认文件名不含后缀。这意味着如果一张照片你既拍了RAWJPG又单独用手机拍了一张同场景的JPG并且你恰好把手机这张JPG也命名成了相同的文件名放进了参考文件夹那么脚本会认为RAW有对应文件从而保留它。这通常不是问题。反过来如果你用不同命名规则比如RAW用序列号JPG用自定义标题那脚本就匹配不上了。所以保持相机出厂的文件命名序列或者使用统一的、有规律的批量重命名是让脚本高效工作的基础。我自己在用了这个脚本几年后最大的体会就是它解决的不仅仅是一个技术问题更是一个工作流问题。它把我们从繁琐重复的体力劳动中解放出来让我们能把更多时间和精力投入到真正的创作和选片中。刚开始可能觉得配置脚本有点麻烦但一旦设置好它就是那个每次整理照片时最值得信赖的“一键清理”助手。