капля applescript: добавьте суффикс к имени файла

Я только что открыл для себя Applescript и начал использовать его потенциал. Я искал решение для этого в течение 2 дней, но ничего не помогло! .. Вот капля applescript, которая обрабатывает размещенные файлы jpg в папке с помощью программы, а затем перемещает полученные файлы в новую подпапку. Я новичок в программировании, и мои навыки очень ограничены. Я пытался добавить суффикс к окончательному обработанному файлу, но никак не мог! Это код.

on adding folder items to this_folder after receiving these_items
set project to (this_folder as text) & "processor.imprc" -- This is the name  of the file that calls the external application

set done_folder to "Done"
tell application "Finder"
        if not (exists folder done_folder of this_folder) then
            make new folder at this_folder with properties {name:done_folder}
        end if
        set the destination_folder to folder done_folder of this_folder as alias
    set the destination_directory to POSIX path of the destination_folder
end tell
    repeat with i from 1 to number of items in these_items
        set this_item to item i of these_items
        set the item_info to info for this_item
        if this_item is not the destination_folder and the name extension of the item_info is "jpg" then
            set the item_path to the POSIX path of this_item
            set the destination_path to the destination_directory & (name of the item_info) -- Here is where I think it defines the name of the "produced" file

tell application "Image Process"  -- From this point on commands for the external application start
            activate
            open project
            tell first document
                set source to item_path
                impose in destination_path
                close saving no
            end tell
        end tell
    end if
end repeat
end adding folder items to

Буду очень признателен за любую помощь в добавлении суффикса (например, «_edited») к каждому обработанному файлу (в папке «Готово»)

Заранее спасибо!

Джош


person Josh045    schedule 17.02.2016    source источник


Ответы (3)


Теперь ваши требования более ясны. Для этого нам понадобится 2 скрипта в действиях с папками:

Первый сценарий прикрепляется к папке A. Он проверяет, существует ли папка done, и, если нет, он создает папку Done, добавляя также новое действие папки под названием Done_Action.

Затем этот сценарий может выбрать каждый файл, помещенный в A, и отправить его в ваше приложение обработки изображений.

Второй сценарий будет действием папки Done. Он обрабатывает каждый файл, добавленный в папку Done (из вашего приложения обработки изображений), чтобы изменить его имя, добавив суффикс «_edited».

Чтобы сделать весь процесс работоспособным, вы должны сделать следующее:

1) Добавьте в первый нижеприведенный сценарий ваши инструкции по приложению образа процесса (я этого не делал, потому что не могу это проверить!)

2) сохраните этот сценарий в сценариях действий с папками (имя не имеет значения) и прикрепите родительскую папку (A) к этому сценарию:

on adding folder items to this_folder after receiving these_items
set project to (this_folder as text) & "processor.imprc" -- This is the name  of the file that calls the external application
set Done_Folder to "Done"
set Done_Script to "Done_Action.scpt"

-- this part creates Done folder if not exist and attached new folder action script Done_Script to Done folder.
tell application "Finder"
    if not (exists folder Done_Folder of this_folder) then
        make new folder at this_folder with properties {name:Done_Folder}
        tell application "System Events"
            make new folder action at end of folder actions with properties {enabled:true, name:Done_Script, path:(this_folder as string) & Done_Folder}
            tell folder action Done_Script to make new script at end of scripts with properties {name:Done_Script}
        end tell
    end if
    set the destination_folder to folder Done_Folder of this_folder as alias
    set the destination_directory to POSIX path of the destination_folder
end tell

repeat This_item in these_items times -- loop on each added item in parent folder
    set the item_info to info for This_item
    if This_item is not the destination_folder and the name extension of the item_info is "jpg" then
        set the item_path to the POSIX path of This_item
        set the destination_path to the destination_directory & (name of the item_info)

        -- add here your Image Process script (I can't test it !) 

    end if
end repeat
end adding folder items to

Как видите, когда папка Done создана, скрипт присоединяет к ней действие с папкой со скриптом Done_Action.scpt.

3) сохраните этот второй сценарий ниже в сценарии действия папки с именем Done_Action.Scpt (оно должно быть таким же, как имя, используемое в первом сценарии)

-- this script is trigger when file is added into the done folder
on adding folder items to this_folder after receiving these_items
set Sufix to "_edited"

repeat with This_Item in these_items
    tell application "Finder"
        set Ext to name extension of This_Item
        set FileName to name of This_Item
        if (offset of Sufix in FileName) = 0 then
            set NameOnly to text 1 thru ((offset of Ext in FileName) - 2) of FileName -- get name without .extension
            set name of This_Item to (NameOnly & Sufix & "." & Ext) -- change the name of the file
        end if
    end tell
end repeat
end adding folder items to

Во время теста у меня были проблемы, потому что каждый раз, когда я менял имя файла в папке done, скрипт запускался снова.

Я думаю, что это ошибка Apple на El Captain (у меня не было этой проблемы на Snow Leopard). Чтобы обойти это, я добавил тест перед изменением имени файла, чтобы проверить, содержит ли имя уже суфикс '_edited'. если это так, то я пропускаю.

Следствием этого является то, что ваши файлы никогда не должны содержать _edited до того, как вы поместите их в родительскую папку A!

Все проверено и ОК (кроме еще самого процесса изображения).

person pbell    schedule 20.02.2016

Приведенный ниже сценарий добавляет суффикс к выбранному вами файлу. Он должен быть добавлен сразу после вашего блока "Процесс изображения" и перед концом повтора.

set This_item to choose file -- to be delete, this is just to test this script alone
set Sufix to "_edited"

tell application "Finder"
set Ext to name extension of This_item
set FileName to name of This_item
set NameOnly to text 1 thru ((offset of Ext in FileName) - 2) of FileName -- get name without .extension
set name of This_item to (NameOnly & Sufix & "." & Ext) -- change the name of the file
end tell
person pbell    schedule 18.02.2016
comment
Большое спасибо, pbell, ваш код так много уяснил, и я думаю, что вы почти решаете проблему. Я пробовал ваш код, но продолжаю получать цикл, в котором внешнее приложение открывает файл (каждый раз с новым суффиксом _edited). Я считаю, что проблема в том, что ваш код переименовывает исходный файл, но не окончательно обработанный файл (внутри папки Done, поэтому капля понимает, что новый файл попал в основную папку, и продолжает создавать новые файлы. Это глупо, но я даже не могу разобраться, как изменить имя каждого (в том-то и дело) сгенерированных файлов ... Есть какие-нибудь советы? Большое спасибо! - person Josh045; 18.02.2016
comment
трудность, с которой я могу вам помочь, заключается в том, что я не знаю, что делает ваше стороннее приложение и как оно это делает. Power, если это приложение публикует результат в новых файлах в папке Done, может быть, вы могли бы просто использовать инструкции по переименованию в сценарии действия новой папки, определенном для папки Done? - person pbell; 18.02.2016
comment
Спасибо, @Pbell, ты прав! Приложение просто берет файлы, которые вы отбрасываете, обрабатывает их и сохраняет с тем же именем и расширением. в папку Done, поэтому я хочу поменять ext. Я подумал о вашем подходе, но не смог автоматизировать процесс со всеми файлами, сброшенными в папку done. Я пробовал с чем-то вроде: set fileN to item i of items in destination_path использовать fileN в вашем коде вместо This_item, но это не сработало ... Будет ли инструкция переименования применяться автоматически к любому файлу в папке Done с добавлением суффикса? Спасибо и извините, я такой тупой! - person Josh045; 19.02.2016
comment
Итак, что вы хотите сделать: 1) перетащите файл F.ext в папку A (путь = A / F.ext). 2) запускается скрипт, который создает папку Done в папке A (путь = A / Done) и отправляет файл F.ext в приложение. 3) это приложение обрабатывает этот файл и сохраняет результат в папке Done с именем F.ext (путь = A / Done / F.ext). последнее, что мне непонятно, - это суффикс. Насколько я понимаю, вы хотите изменить A / F.ext на A / F_edited.ext. тогда у меня вопрос: как узнать, что приложение его обработало? только потому, что теперь у вас есть A / Done / F.ext? подтвердите пожалуйста, и мы найдем решение. - person pbell; 19.02.2016
comment
Такие люди, как вы, напрасно тратят время с такими, как я, потрясающие. Нам нужно больше этого в этом мире, спасибо. Вы правы, внешнее приложение редактирует файл и сохраняет его в A / Done / F.ext (то же имя, что и в A / F.ext). Я знаю, что он обрабатывается, потому что он создает файл (часть кода приложения работает нормально). Поэтому я хочу добавлять суффикс не к A / F.ext, а к A / Done / F_edited.ext (таким образом у меня есть исходный файл с одним именем и отредактированный с отредактированным суффиксом в A / Done /). (Продолжение ниже ...) - person Josh045; 20.02.2016
comment
Моя самая большая проблема заключается в том, что то, что я опускаю до A, является более чем одним файлом одновременно, и я не могу понять, как правильно применить переменную к коду, чтобы изменение всех имен (добавление суффикса) файлов в A / Done / выполняется автоматически. Еще раз спасибо за триллион @pbell! - person Josh045; 20.02.2016

Большое спасибо @pbell! ... Ваш код отлично заработал после некоторых попыток. Сначала код (для первой капли, той, которая обрабатывает файлы) у меня не работал ... Просто ничего не делал. Тогда я решил изменить эту часть вашего кода:

repeat This_item in these_items times -- loop on each added item in parent folder

для этого другого:

repeat with i from 1 to number of items in these_items
    set this_item to item i of these_items -- loop on each added item in parent folder

Если честно, я не очень хорошо знаю 1) Почему я его поменял. 2) Почему после смены стало нормально работать.

Вы упомянули что-то об Эль-Капитане, а я все еще использую Mavericks (я знаю ...), так что, возможно, ему есть чем заняться ...

Итак, после изменения на самом деле он не сразу начал работать, только после пары попыток сброса / удаления файлов (в A / F.ext) он начал работать отлично. Я понятия не имею, почему это произошло, я предполагаю, что это как-то связано со структурой файловой системы: я использую Pathfinder и включил скрытые файлы, и заметил, что это произошло после того, как скрытый файл ".DS_Store" появился в обеих папках (A & Done ) когда все заработало нормально.

Так что еще раз спасибо @pbell, ты гений, и теперь я узнал немного больше (хотя все еще тупой) ... Вскоре мне нужно будет сделать еще один applescript, чтобы переместить определенные файлы из разных подпапок в родительские, а затем и там попытаться сжать их все ... это моя следующая задача, но я думаю, что это будет намного проще, чем эта :) Я очень благодарен и надеюсь, что это поможет другим! ...

person Josh045    schedule 21.02.2016