Applescript:获取所选文件的修改日期并输出为文本

Applescript: Get modification date of selected file and output as text

我最近一直在使用 Apple Automator 应用程序来帮助我保持文件结构和文件名的顺序。 我找到了一个漂亮的脚本,它以 YYYY-MM-DD 格式输出今天的日期并替换 selected 文本。这很酷,因为我的文件和文件夹的基本数据结构是 YYYY-MM-DD-name-of-project.
现在,我希望能够将提到的日期重命名为上次修改的日期,以便跟踪我编辑内容的时间。 (基本上允许我只 select 前一个日期,点击键盘快捷键来调用服务脚本并覆盖它。)
我已经尝试了一些方法,但我似乎无法完成它。

帮助将不胜感激!非常感谢你提前。 (我希望这不是重复的。)
干杯!

如果您需要我所说的脚本:

on todayISOformat()
    set theDate to current date
    set y to text -4 thru -1 of ("0000" & (year of theDate))
    set m to text -2 thru -1 of ("00" & ((month of theDate) as integer))
    set d to text -2 thru -1 of ("00" & (day of theDate))
    return y & "-" & m & "-" & d
end todayISOformat

on run {input, parameters}
   return todayISOformat()
end run

下面的示例 select 一个文件并获取该文件的最后修改日期。

当然,您可以再次使用例程来根据需要格式化日期:

set MyFile to choose file
tell application "Finder" to set DateUpdate to modification date of MyFile

set StringToday to todayISOformat(current date)-- get the string value of current date
set StringModif to todayISOformat(DateUpdate)-- get the string value of modification's date

on todayISOformat(LDate)
set y to text -4 thru -1 of ("0000" & (year of LDate))
set m to text -2 thru -1 of ("00" & ((month of LDate) as integer))
set d to text -2 thru -1 of ("00" & (day of LDate))
return y & "-" & m & "-" & d
end todayISOformat

此脚本根据以下 2 条规则重命名任何选定的文件:

  1. 如果文件名以 YYYY-MM-DD- 开头,它会将此前缀替换为文件的当前修改日期。
  2. 如果文件不是以 YYYY-MM-DD- 开头,它会将文件的当前修改日期放在文件名前面。

不考虑文件夹。

tell application "Finder"
    repeat with anItem in (get selection)
        if class of anItem is not folder then
            set {currentFileName, modificationDate} to {name, modification date} of anItem
            set formattedModificationDate to my formatDate(modificationDate)
            if text 11 of currentFileName is "-" then
                set newFileName to formattedModificationDate & text 11 thru -1 of currentFileName
            else
                set newFileName to formattedModificationDate & "-" & currentFileName
            end if
            set name of contents of anItem to newFileName
        end if
    end repeat
end tell

on formatDate(aDate)
    tell aDate to tell 100000000 + day * 1000000 + (its month) * 10000 + year as string ¬
        to return text -4 thru -1 & "-" & text 4 thru 5 & "-" & text 2 thru 3
end formatDate

更新:

脚本只检查第 11 个字符是否为连字符。如果需要检查整个 YYYY-MM-DD- 模式,您可以使用此处理程序

on validateYYYYMMDD(aDateString)  -- returns true on success
    try
        tell aDateString
            (text 1 thru 4) as integer
            (text 6 thru 7) as integer
            (text 9 thru 10) as integer
            return text 5 is "-" and text 8 is "-" and text 11 is "-"
        end tell
    on error
        return false
    end try
end validateYYYYMMDD 

或者如果您安装了 SatImage.osax,它提供了无需 shell 调用的正则表达式搜索

on validateYYYYMMDD(aDateString) -- returns true on success
    try
        find text "^\d{4}-(\d{2}-){2}" in aDateString with regexp
        return true
    on error
        return false
    end try
end validateYYYYMMDD

要使用处理程序替换行

if text 11 of currentFileName is "-" then

if my validateYYYYMMDD(currentFileName) then

您可以使用 «class isot» 将日期转换为 iso 日期时间字符串。您只需要从中获取字符 1 到 10 即可仅获取 iso 日期字符串。

tell application "Finder"
    repeat with anItem in (get selection)
        if class of anItem is not folder then
            set {fileName, modificationDate} to {name, modification date} of anItem
            set isoDate to text 1 thru 10 of (modificationDate as «class isot» as string)
            if text 11 of fileName is "-" then set fileName to text 11 thru -1 of fileName
            set newFileName to isoDate & "-" & fileName
            set name of contents of anItem to newFileName
        end if
    end repeat
end tell