AppleScript将文件移动到正确的位置

时间:2018-08-05 08:11:12

标签: applescript

目标:

我正在尝试编写一个脚本,可以将其绑定到文件夹操作中,以将文件从下载文件夹移至正确的位置。该文件夹将显示音乐,电影和电视节目或体育节目。将有单个文件以及包含多个项目的文件夹。我已经完成了脚本的框架,但是我在做一些我知道如何用其他语言进行操作的事情。

参数:

电视:单个文件为S %% E %%,文件夹为S %%

电影:具有单个视频文件(mkv,mp4,m4v)且名称中没有S %% E %%的文件夹,或没有S %%的文件夹

音频:单个文件的文件类型(mp3,aac,flac,wav),文件夹很难看到内容

问题:

如何更改文件选择以包括要测试的文件夹和文件?我认为从Automator中的文件夹操作中输入脚本输入时,这种方法会很好用,但还不确定。

Applescript中似乎没有通配符可用于我的比较。

我的主要问题是不知道如何打开文件夹项目以及如何在目录中循环查找某些扩展名或名称。

GitHub:https://github.com/wiebs2334/DownloadManager

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

Vanilla AppleScript无法处理通配符以进行文本搜索,但是有免费的脚本添加Satimage.osax,其中添加了强大的功能,例如使用正则表达式查找文本

您可以在Smile Companion OSAX网站上找到OSAX。下载Satimage osax 3.7.0 (build 411)并将文件放入/Library/ScriptingAdditions(顶级Library!)

这是使用Scripting Addition优化的脚本,基本的正则表达式是

  • "\\.S\\d{2}E":查找一个点,后跟大写字母S,后跟两位数字和首字母E
  • "(nhl|nfl|ncaa)":文本包含“ nhl”或“ nfl”或“ ncaa”

如果文本与模式不匹配,则会引发错误。


主要变化是

  • run处理程序显示一个对话框,用于选择文件或文件夹
  • 添加了open处理程序,以将脚本用作小滴
  • 您的if/end if - if/end if表达式已替换为if/else if/end if

如果您打算将该脚本用作文件夹操作,则无论如何都将文件和文件夹视为


property audioKeywords : {"mp3", "aac", "flac", "wav"}
property videoExtensions : {"mkv", "m4v", "mov", "mp4"}

on run
    set {button returned:buttonReturned} to display dialog "Choose files or folders" buttons {"Cancel", "Choose Files", "Choose Folders"}
    if buttonReturned is "Choose Files" then
        classifyItems for (choose file with multiple selections allowed)
    else
        classifyItems for (choose folder with multiple selections allowed)
    end if

end run

on open theItems
    classifyItems for theItems
end open

to classifyItems for myFiles
    repeat with anItem in myFiles
        set anItem to anItem as text
        set isVideo to false
        set isTV to false
        set isMovie to false
        set isAudio to false
        set isSports to false
        tell application "System Events" to set {theClass, theName, theExt, theContainer} to {class, name, name extension, container} of disk item anItem --set variables
        set className to theClass as text
        (*  &&&&&&&&&&&&&&&&&&&&&&&&&&&&  Files  &&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
        if className is "file" then
            ###########  Video ############
            if theExt is in videoExtensions then --search through all video extensions
                set isVideo to true
                ###########  TV ############
                try
                    find text "\\.S\\d{2}E" in theName with regexp
                    set isTV to true
                on error
                    ###########  Sports ############
                    try
                        find text "(nhl|nfl|ncaa)" in theName with regexp
                        set isSports to true
                    on error
                        ###########  Movies ############
                        set isMovie to true
                    end try
                end try
                ###########  Audio ############
            else if theExt is in audioKeywords then
                set isAudio to true
            end if

            (*  &&&&&&&&&&&&&&&&&&&&&&&&&&&&  Folders  &&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
        else if className is "folder" then
            ###########  TV ############
            try
                find text "\\.S\\d{2}\\." in theName with regexp
                set isTV to true
            on error
                try
                    ###########  Audio ############
                    find text "(mp3|aac|flac|wav)" in theName with regexp
                    set isAudio to true
                on error
                    ###########  Movie ############
                    set isMovie to true
                end try
            end try
        end if

        display dialog ("Type:" & theClass & " || Ext:" & theExt & " || Video:" & isVideo & "
        " & theName & "
        Movie:" & isMovie & " || TV:" & isTV & " || Sports:" & isSports & "
        Audio:" & isAudio)

    end repeat
end classifyItems