【问题标题】:Searching all external drives in Automator在 Automator 中搜索所有外部驱动器
【发布时间】:2021-09-03 01:11:19
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

  • 是否有任何重复的文件名被复制,如果是,你想如何处理重复?
  • 是的,每次搜索之前已经搜索过的驱动器时,都会复制重复文件,所有已经存在的 .txt 文件都可以替换为较新的文件。这是我到目前为止的设置(当我在每次使用前通过编辑自动化程序指定驱动器名称时有效): - 暂停 2 秒 - 查找查找器搜索 [驱动器名称] 以下所有内容都是正确的:文件扩展名为 .txt - 将查找器项目复制到 [目标文件夹],是替换现有文件

标签: applescript automator


【解决方案1】:

我知道您提到了 AppleScript,但是,这可以在 Terminal 中更简单直接地完成。

您无需担心/Volumes 中的Macintosh HD,因为它是一个符号链接find,没有适当的选项 不会遍历符号链接

Automator 工作流程中使用以下示例 shell脚本 代码 , 简单的添加一个Run Shell Script action,添加下面一行code 同时将'/path/to/destination' 更改为目录 文件将被复制到。

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

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

就是这样,只需在工作流程中完成一个动作即可。

此外,如果您在没有连接外部磁盘的情况下运行此程序,请不要担心,因为它基本上什么都不做。


注意事项:

如果由于某种原因您需要使用 Run AppleScript action,您仍然可以使用 example shell 脚本 code 使用 AppleScriptdo shell script command,例如:

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

【讨论】:

  • 我很确定你可以避免使用这个管道到xargs...find /Volumes -type f -iname '*.txt' -exec cp {} /path/to/destination/ \;
  • @wch1zpink,是的,您可以使用-exec,但据我了解,使用 NUL 终止的 string 更安全,因此在find command 中使用-print0 和使用xargs
  • 非常感谢@user3439894!这行得通,而且确实是一种非常直接的方法,我喜欢它!
【解决方案2】:

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

  • 运行 Applescript(其内容见下文)
  • 复制 Finder 项目(选择您的目标以及是否会替换文件)

至于脚本,它应该替换“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

注意事项: 系统事件块生成额外磁盘的列表。运行此命令时请注意前三个结果:

tell application "System Events" to POSIX path of disks
--> {"/", "/home", "/net", "/Volumes/xdisk1", "/Volumes/xdisk2"}

applescript 然后运行一个 shell 脚本,循环通过找到的磁盘 'dr' 并搜索纯文本文件。生成的“afList”被传递给 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}

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

【讨论】:

  • 谢谢,我试试看!该脚本不应该在没有连接外部驱动器的情况下运行,因为它将由处理备份的应用程序自动运行(.txt 文件是备份的传输日志),所以这不是问题。此外,生成这些传输日志的文件夹永远不会在设置为不被搜索的文件夹中,所以这也不是问题!基本上,我只需要一个解决方法来解决始终在外部驱动器上生成传输日志的软件,而无法在内部驱动器上选择不同的目的地......
  • 您可以添加错误处理,以便工作流优雅地处理无驱动器问题,但现在它只会给您一个错误。如果这些日志文件有任何其他共同特征(例如,某些单词总是在名称中,或者它们位于名称相似的文件夹中,等等),那么您可以调整脚本以将其考虑在内。
  • 嗨!我试过这个脚本,但我总是收到以下语法错误:Failed to create query for '1 kMDItemContentType=public.plain-text'。
  • 如果您在终端中运行它会发生什么:mdfind -onlyin /Volumes/xdisk1 kMDItemContentType="public.plain-text"(当然,那里有一个实际的驱动器名称)。基本上,do shell 脚本行构建并运行该命令。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多