使用 Automator 使用带有文件名的 txt 文件将文件复制到新目的地,跳过不存在的文件

Use Automator to copy files to a new destination using a txt file with filenames, skip non existent files

与描述的问题类似 ,我有一个包含文件名的文本文件和一个包含需要复制到另一个目标的图像文件的文件夹。由于经常有数百个文件,因此自动执行此任务会很有帮助。

挑战在于文本文件中的某些文件可能不存在,而我现有的脚本的当前版本无法解决这种情况并引发错误。

总而言之,我想使用 Automator 和 Apple Script 来:

  1. 请求包含原始文件的源文件夹
  2. 要求一个目标文件夹,它们应该被复制到
  3. 请求一个包含文件名的文本文件
  4. 从文本文件中读取姓名
  5. [new]检查是否存在匹配文件并将其复制到目标
  6. [new]如果没有匹配的文件则跳过该行并继续下一个

这是我目前所拥有的 - 只要文本文件中的每一行都有一个实际图像,它就可以工作:

Automator Actions

和 AppleScript:

on run {input, parameters}
    
    set imgDestination to input's item 2
    set imgSource to input's item 1
    
    set imgNameFile to choose file with prompt {"Select file of image filenames:"}
    
    set imageList to every paragraph of (read imgNameFile)
    
    repeat with eachName in imageList
        tell application "Finder"
            set targetImageFile to item 1 of (get every file in folder imgSource whose name = (eachName as text))
            duplicate targetImageFile to folder imgDestination
        end tell
    end repeat
    return input
end run

不幸的是,我的技能不足以为 5 和 6 提出 if/else 方案,因此非常感谢任何帮助。

如果未找到该文件,则 targetImageFile 变量设置为 {}(即空列表)。该错误由 duplicate 命令引发,因为它无法复制此空列表。问题的解决方法是:只有当targetImageFile值不是{}时才尝试复制。

on run {input, parameters}
    
    set imgDestination to input's item 2
    set imgSource to input's item 1
    set imgNameFile to choose file with prompt {"Select file of image filenames:"}
    set imageList to paragraphs of (read imgNameFile)
    
    repeat with eachName in imageList
        tell application "Finder"
            set targetImageFile to (first file in folder imgSource whose name = eachName)
            if targetImageFile is not {} then duplicate targetImageFile to folder imgDestination
        end tell
    end repeat
    
    return input
end run

您必须检查文件是否存在。

您的脚本效率很低,因为 Finder 中的 whose 子句非常昂贵,尽管您可以使用

避免循环
tell application "Finder"
    duplicate (get every file in folder imgSource whose name is in imageList) to folder imgDestination
end tell

更有效的方法是检索文件 names 一次并检查列表是否包含当前名称。

如果文本文件是准标准的 UTF8 编码,可能会出现意外行为。如果是这样,您必须 read 文本文件 as «class utf8».

最后,如果 input 中的源引用和目标引用是 AppleScript 别名说明符,则您必须删除所有出现的 folder 关键字。

on run {input, parameters}
    
    set imgDestination to input's item 2
    set imgSource to input's item 1
    
    set imgNameFile to choose file with prompt {"Select file of image filenames:"}
    set imageList to every paragraph of (read imgNameFile as «class utf8»)
    
    tell application "Finder" to set fileNames to name of every file in folder imgSource
    
    repeat with eachName in imageList
        if fileNames contains eachName then
            tell application "Finder" to duplicate file eachName of folder imgSource to folder imgDestination
        end if
    end repeat
    return input
end run