Applescript,显示所有带标签的文件

Applescript, show all files with tag

我正在尝试构建一个 applescript,它将根据当前时间打开并显示所有标记有学校 class 我目前所在学校的文件。例如,如果时间是星期二上午 10 点,它会显示我所有标有 Chemistry 的文件。现在,我已经让 AppleScript 获得 class 的正确名称。

现在我需要告诉 Finder 打开带有正确标签的文件。我该怎么做?

基本上是这样的:

set tagged to "Tag:Chemistry"
tell application "Finder"
    reveal tagged
    activate
end tell

当然,这里的tag是动态赋值的

我在 GUI 中执行此操作的方式是 Smart Folders。进入 Finder,单击 File->New Smart Folder,然后会出现一个新的 Finder window。单击 Save 右上角的 +,然后将 window 左上角的 Kind 更改为 Tags。在 Tags 旁边选择 contains,然后键入 Chemistry。单击右上角的 Save 并将其命名为 Chemistry Stuff 并允许将其添加到侧边栏。然后会出现在所有Finder的左边windows.

在我经常居住的 shell/Terminal,我使用 tag 来达到这个目的。我使用 brew install tag 使用 homebrew 安装了它。然后我可以做 tag -f sometag 并列出所有标记为 sometag.

的文件
tag - A tool for manipulating and querying file tags.
  usage:
    tag -a | --add <tags> <file>...     Add tags to file
    tag -r | --remove <tags> <file>...  Remove tags from file
    tag -s | --set <tags> <file>...     Set tags on file
    tag -m | --match <tags> <file>...   Display files with matching tags
    tag -l | --list <file>...           List the tags on file
    tag -f | --find <tags>              Find all files with tags
  <tags> is a comma-separated list of tag names; use * to match/find any tag.
  additional options:
        -v | --version      Display version
        -h | --help         Display this help
        -n | --name         Turn on filename display in output (default)
        -N | --no-name      Turn off filename display in output (list, find, match)
        -t | --tags         Turn on tags display in output (find, match)
        -T | --no-tags      Turn off tags display in output (list)
        -g | --garrulous    Display tags each on own line (list, find, match)
        -G | --no-garrulous Display tags comma-separated after filename (default)
        -H | --home         Find tagged files only in user home directory
        -L | --local        Find tagged files only in home + local filesystems (default)
        -R | --network      Find tagged files in home + local + network filesystems
        -0 | --nul          Terminate lines with NUL ([=10=]) for use with xargs -0

您可以使用命令行工具 "mdfind" 搜索使用 "kMDItemUserTags" 标记的文件。这就是我找到标记文件的方式。

问题的另一部分是为当前时间找到合适的标签。我会为此使用 applescript 记录。例如你可以这样记录:

{theTag:"Chemistry", startTime:date ("10:00 AM"), endTime:date ("11:00 AM")}

因此,如果您创建一个记录列表,您可以遍历它们并将列表中每条记录的开始和结束时间与当前日期进行比较。

最后,一旦你有了它并假设你用 mdfind 找到了一些文件,那么你可以循环找到找到的文件并要求 Finder 打开它们。

试试这个。请注意,您必须在用户变量部分提供 [​​=24=] 和 "searchFolder" 的值。

-- user variables
set requirementsRecords to {{theTag:"Chemistry", startTime:date ("10:00 AM"), endTime:date ("11:00 AM")}, {theTag:"Math", startTime:date ("11:00 AM"), endTime:date ("12:00 PM")}}
set searchFolder to path to desktop


-- find the tag information given the current time
set now to current date
set thisTag to missing value
repeat with i from 1 to count of requirementsRecords
    set thisRecord to item i of requirementsRecords
    set thisStartTime to startTime of thisRecord
    set thisEndTime to endTime of thisRecord

    if now is greater than or equal to thisStartTime and now is less than or equal to thisEndTime then
        set thisTag to theTag of thisRecord
        exit repeat
    end if
end repeat
if thisTag is missing value then error "Could not find a tag for the current time!"

-- search the search folder for files with the tag
set cmd to "mdfind -onlyin " & quoted form of POSIX path of searchFolder & " \"kMDItemUserTags == " & quoted form of thisTag & "\""
set resultsList to paragraphs of (do shell script cmd)
if resultsList is {} then error "Could not find any files tagged \"" & thisTag & "\" in the search folder"

-- open the found files with the Finder
repeat with anItem in resultsList
    set thisFile to POSIX file anItem
    tell application "Finder" to open thisFile
end repeat

您可以使用 GUI 脚本 单击查找器中的左窗格 window。

因为此脚本使用 GUI Scripting 来控制用户界面,您必须将小程序添加到批准列表中,该列表显示在“安全和隐私”系统首选项窗格中。

set tagName to "Chemistry" -- the full tag's name
my showFinderWindow(tagName)

on showFinderWindow(thisTag)
    tell application "Finder" to if not (exists Finder window 1) then make new Finder window
    tell application "System Events"
        tell process "Finder"
            repeat with i in windows
                tell outline 1 of scroll area 1 of splitter group 1 of i to if exists then
                    tell (first row whose value of its static text 1 is thisTag) to if exists then perform action "AXOpen" of static text 1
                    exit repeat
                end if
            end repeat
        end tell
    end tell
end showFinderWindow