使用Automator在Finder中获取文本文件的内容

时间:2018-08-09 00:21:34

标签: macos automator

我正在尝试创建一个automator-app,可以将finder-folder放入其中。它需要过滤所有(数千个)txt文件,并将内容传递给“文本到音频文件”

但是唯一可用的操作是“获取TextEdit文档的内容”,这是当前打开的TextEdit文档。

是否没有办法仅获取所选文档的内容?我认为这是很常见的用法?

2 个答案:

答案 0 :(得分:0)

在Automator中,将“运行AppleScript”操作添加到您的工作流程中,然后将以下AppleScript代码插入该“运行AppleScript”操作中。

基本上,该代码将在Finder中获取当前选择的文件,并且如果当前选择的文件的扩展名为“ txt”,它将把该文本文件的内容传递到您的下一个工作流程操作中,即……到音频文件

tell application "Finder"
    set theSelectedFile to (get selection)
end tell
tell application "System Events"
    set nameExtension to name extension of (theSelectedFile as alias)
    set fileName to name of (theSelectedFile as alias)
end tell
if nameExtension is "txt" then
    set theContent to read (theSelectedFile as alias)
    set the clipboard to fileName as text
else
    return
end if
return theContent

enter image description here

接下来,您将创建一个新的AppleScript变量,并将其插入“文本到音频文件”操作的“另存为”字段中。使用值theNameset theName to the clipboard,如上面的屏幕截图。这样做会将新创建的音频文件的名称设置为原始源文本文件的名称

答案 1 :(得分:0)

鉴于您要处理的文件数量巨大,而且需要将其内容转换为语音,我觉得这个特殊的问题比AppleScripting整体更适合bash脚本编写。

这是我提出的 Automator 工作流程的屏幕截图,我相信它可以满足您的所有需求和要求:

Automator workflow on macOS High Sierra

为简单的复制粘贴操作,在此答案的底部复制了两个脚本(shell脚本和AppleScript),但是每个内容在屏幕截图中都是完全可见的。

概述

此工作流程旨在作为 Finder 中的服务进行操作,通过该服务,您可以选择一个文件夹,右键单击并从弹出窗口中运行该工作流程上下文菜单。您还可以为其分配键盘快捷键。

该文件夹被传递到工作流程中。检索其内容,这为工作流提供了文件夹内文件的列表。这些将发送到shell脚本中。

shell脚本导航到提供的文件夹中,并创建一个名为"Audio"的子文件夹,其中将保存音频文件。然后,它遍历提供的文件夹中的每个文件。如果该文件不是.txt文件,则将其传递。否则,命令行工具 say 用于将每个文件的内容转换为语音轨道。我为其选择了一种会说普通话的声音(“ Sin-ji”)。用于音频文件的数据格式为aac,这避免了以后必须在 iTunes 中进行第二次转换。该文件格式使用了似乎不熟悉的文件扩展名.m4b,但实际上是一个封装在aac包装程序中的mp4文件,文件扩展名根据Apple的建议进行了更改。 .m4b扩展名告诉macOS音频文件是 iTunes 有声读物(Apple使用的其他音频文件是.m4a用于常规音频,.m4r用于铃声)。使用.m4b文件扩展名的妙处在于,将其导入 iTunes 后,立即将其识别为有声读物,并放置在有声读物部分。

shell脚本返回到"Audio"目录的路径,该目录现在已填充有声书文件。工作流程将检索此目录的内容(即有声读物文件),然后将其导入 iTunes 中,而不进行任何进一步的转换。他们被直接发送到图书馆,最后进入有声读物部分。

令人讨厌的一点是:似乎 iTunes 将新文件导入其库时,它会暂时锁定文件,大概是因为文件被复制,扫描的文件以及元数据被写入。在此期间,无法设置新导入的曲目的任何属性,并且会导致“文件权限错误”。

持续时间因系统而异,可能还取决于导入的文件数。

在工作流程中插入5秒钟的暂停时间,可以使文件有足够的时间在我的系统上解锁,然后再执行最终的AppleScript。

根据您的请求,AppleScript的唯一工作就是使用下划线("_")之前的文件名部分来命名专辑,这就是它的作用。如果此时文件轨道都已解锁,则效果会很好。如果其中任何一条轨道仍被锁定,将导致脚本(以及工作流程)引发错误。

(奇怪的是,放入错误处理程序以捕获错误并阻止其停止脚本似乎也阻止了属性的设置。 iTunes AppleScript中发生了一些错误,但这并没有没让我感到惊讶。)


脚本

Shell(打击)

    cd "$(dirname "$1")"      # Go into supplied folder
    mkdir -p "Audio"        # Create a folder for the audio files
    cd "Audio"

    shopt -s nocasematch    # For case-insensitive regex matching

    for f in "$@"; do        # Loop thru files; txt → m4b (audiobook)
        fn=$(basename "$f")
        [[ "${f##*.}" =~ txt ]] && \
        say --voice=Sin-ji \
            --output-file="${fn%.*}.m4b" \
            --input-file="$f" \
            --file-format=m4bf \
            --data-format=aac
    done

    pwd                     # Return the present working directory
                            # i.e. the "Audio" folder

AppleScript

    use application "iTunes"
    property text item delimiters : "_"

    on run {input, parameters}

        repeat with m4b in the input
            set m4b's album to text item 1 of (m4b's name as text)
        end repeat

    end run

下载工作流程

最后,我已经为您上传了 Automator 服务工作流程到download,省去了您从头开始重新创建所有工作流程的麻烦。它应该在未来30天内可用。