如何修改Mac Finder的Duplicate脚本,实现文件已存在时保留双方文件?
解决Finder中AppleScript Duplicate命令文件重复时的保留双方/弹窗选择问题
默认情况下,Finder的duplicate命令在目标位置已有同名文件时会终止操作并报错。针对你提供的脚本,以下两种修改方案可以实现需求:
方案1:自动保留双方文件(自动重命名)
遍历文件夹A中的每个文件,若目标文件夹B中已存在同名文件,自动生成带"副本"后缀的新文件名(重复则递增数字),避免冲突:
tell application "Finder" -- 转换为alias类型,确保Finder能正确识别路径 set folderA to alias "Macintosh HD:Users:User:Downloads:A" set folderB to alias "Macintosh HD:Users:User:Downloads:B" repeat with aFile in every file of folderA set fileName to name of aFile set targetPath to folderB as string & fileName -- 检查目标文件是否存在 if exists file targetPath then -- 拆分文件名和扩展名 set dotPosition to offset of "." in fileName if dotPosition > 0 then set baseName to text 1 thru (dotPosition - 1) of fileName set fileExtension to text (dotPosition + 1) thru end of fileName set newFileName to baseName & " 副本." & fileExtension else -- 无扩展名的文件直接加"副本" set newFileName to fileName & " 副本" end if set newTargetPath to folderB as string & newFileName -- 如果"副本"文件也存在,递增数字直到找到可用名称 set counter to 2 while exists file newTargetPath if dotPosition > 0 then set newFileName to baseName & " 副本 " & counter & "." & fileExtension else set newFileName to fileName & " 副本 " & counter end if set newTargetPath to folderB as string & newFileName set counter to counter + 1 end while -- 复制文件后重命名为新名称 duplicate aFile to folderB with replacing set name of result to newFileName else -- 目标无同名文件,直接复制 duplicate aFile to folderB without replacing end if end repeat end tell
方案2:弹出选择提示(让用户手动操作)
遇到重复文件时弹出系统对话框,允许用户选择替换、保留双方或跳过当前文件:
tell application "Finder" set folderA to alias "Macintosh HD:Users:User:Downloads:A" set folderB to alias "Macintosh HD:Users:User:Downloads:B" repeat with aFile in every file of folderA set fileName to name of aFile set targetPath to folderB as string & fileName if exists file targetPath then -- 弹出操作选择对话框 set userChoice to display dialog "文件 '" & fileName & "' 已存在于目标文件夹,请选择操作:" ¬ buttons {"替换", "保留双方", "跳过"} ¬ default button "保留双方" set buttonPressed to button returned of userChoice if buttonPressed is "替换" then -- 直接替换目标文件 duplicate aFile to folderB with replacing else if buttonPressed is "保留双方" then -- 生成新文件名(逻辑同方案1) set dotPosition to offset of "." in fileName if dotPosition > 0 then set baseName to text 1 thru (dotPosition - 1) of fileName set fileExtension to text (dotPosition + 1) thru end of fileName set newFileName to baseName & " 副本." & fileExtension else set newFileName to fileName & " 副本" end if set newTargetPath to folderB as string & newFileName set counter to 2 while exists file newTargetPath if dotPosition > 0 then set newFileName to baseName & " 副本 " & counter & "." & fileExtension else set newFileName to fileName & " 副本 " & counter end if set newTargetPath to folderB as string & newFileName set counter to counter + 1 end while duplicate aFile to folderB with replacing set name of result to newFileName else if buttonPressed is "跳过" then -- 跳过当前文件,继续处理下一个 continue end if else duplicate aFile to folderB without replacing end if end repeat end tell
注意事项
- 脚本中路径使用
alias类型而非纯字符串,能避免Finder无法识别路径的问题; - 无扩展名的文件(如README)也会被正确处理;
- 方案1的重命名逻辑和Finder原生的"保留双方"行为一致,用户体验统一。
内容的提问来源于stack exchange,提问作者pakinimo
相关产品推荐
相关产品推荐

