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
我正在尝试构建一个 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