在 Automator 中搜索所有外部驱动器

Searching all external drives in Automator

我正在尝试执行自动操作,在所有外部驱动器中搜索 .txt 文件,然后将这些文件复制到内部 Macintosh HD 驱动器上的文件夹中。

我遇到的问题是我无法找到一种方法来执行此操作而不必每次都指定每个外部驱动器的名称,但每次都是新的并且不可预测。有没有什么方法可以“间接”指定外部驱动器的路径(我想象的是 USB 端口的“指针”之类的东西)?

我知道隐藏的 /Volumes 文件夹,但是这也会在所有 Macintosh HD 中搜索 .txt 文件,这是我不想要的...

提前致谢!

您需要考虑 user3439894 提出的关于重复项的观点。在那之前,试试这个:

  • 运行 Applescript(内容见下文)
  • 复制 Finder 项目(Select 您的目的地以及它是否会替换文件)

至于脚本,这应该替换 'run applescript' 文本框的 全部内容 。请注意这里没有错误处理。如果您 运行 在没有连接外部驱动器的情况下执行此操作,您可能会遇到错误。

tell application "System Events"
    set drList to POSIX path of disks 4 thru -1
end tell
set afList to {}
repeat with dr in drList
    copy (do shell script "mdfind -onlyin " & dr & "  kMDItemContentType=\"public.plain-text\"") to end of afList
end repeat
tell application "Finder"
    set bfList to {}
    repeat with w in paragraphs of item 1 of afList
        set x to w as text
        set y to POSIX file x as alias
        copy y to end of bfList
    end repeat
end tell
bfList

备注: 系统事件块生成额外磁盘列表。当您 运行 this:

时,请注意前三个结果
tell application "System Events" to POSIX path of disks
--> {"/", "/home", "/net", "/Volumes/xdisk1", "/Volumes/xdisk2"}

applescript 然后 运行 是一个 shell 脚本,循环遍历找到的磁盘 'dr' 并搜索纯文本文件。生成的 'afList' 被传递给 Finder,Finder 将其转换为别名列表 'bfList' 以传递给复制操作。由于它使用 mdfind 搜索,因此不会搜索任何设置为不搜索的文件夹。

bfList 类似于:

{alias "xdisk1:for cleanup:Various.txt, alias "xdisk1:OtherVideo_archive:Lecture Series:lecture.06.txt", alias "xdisk2:for cleanup:Reservation notes.txt}

有多种方法可以执行此任务,但这个方法相对简单,应该可以轻松更改文件类型或复制目标。

我知道你提到了 AppleScript,然而,这可以在 Terminal.[=16= 中更容易和直接地完成]

您无需担心 /Volumes 中的 Macintosh HD,因为它是 符号 link并且 find 没有适当的 选项 不会遍历 符号 link.

要在 示例 shell 脚本 代码 Automator workflow, 简单添加一个运行 Shell Script action,在将 '/path/to/destination' 更改为 目录 时添加以下行 code 文件 将被复制到。

find /Volumes -type f -iname '*.txt' -print0 | xargs -I '{}' -0 cp -a '{}' '/path/to/destination'

这将在外部磁盘上找到所有 .txt 文件 并将它们复制到 destination 同时覆盖 目标 中现有的 文件

就是这样,只需在工作流程中执行一个操作即可。

此外,如果您 运行 没有附加外部磁盘,请不要担心,因为它基本上什么都不做。


备注:

如果出于某种原因您需要使用 运行 AppleScript action,您仍然可以使用 示例 shell 脚本 代码 使用do shell script 命令[= AppleScript 的 67=],例如:

do shell script "find /Volumes -type f -iname '*.txt' -print0 | xargs -I '{}' -0 cp -a '{}' '/path/to/destination'"