Повторяющееся переименование Applescript

Я пытаюсь создать каплю AppleScript, чтобы переименовать кучу изображений, раздражающе отформатированных, но я обнаружил, что мои навыки AppleScript исчезли, и я ничего не получаю. Так что, если возможно, полный код, а не только фрагменты.

Настройка файла всегда одинакова, но есть много вариантов (например: Yellowst.Nat.Park.D12P55.DMS.3248.jpg)

  • Он начинается с названия места, должно быть найдено и заменено несколько разных строк («Yellowst.Nat.Park» -> «Йеллоустонский национальный парк»).
  • Затем следуют два числа, которые следует изменить в формате (D12P55 -> [12x55]). Они всегда обозначаются буквой «D», за которой следуют две цифры, буква «P» и снова две цифры.
  • И это заканчивается случайной строкой, это могут быть цифры, буквы и т. д., которые все должны пройти. Они отличаются форматом и длиной, в них нет узора.

По сути, я хочу перейти от «Yellowst.Nat.Park.D12P55.DMS.3248.jpg» к «Yellowstone National Park [02x03] .jpg». Я хочу добавить текст после этого, поэтому хочу закончить пробелом.

Лучший способ сделать это, мне кажется, повторять поиск и замену для первой части. Составьте список для набора терминов, которые должны быть заменены набором соответствующих терминов. Далее следует определение формата числа и заканчивается удалением после него случайной строки.


person Sam Wise    schedule 14.02.2012    source источник
comment
Рассматривали ли вы возможность использования Automator? Вы должны быть в состоянии собрать что-то довольно быстро, используя встроенные действия. Лично я бы, вероятно, использовал более общий язык сценариев, такой как Ruby или PHP, или сделал несколько сценариев оболочки. Но в противном случае я бы, вероятно, сам выбрал решение Automator, а не сырой AppleScript. Честно говоря, я считаю, что это слишком много работы для таких задач.   -  person Flambino    schedule 15.02.2012
comment
У меня есть. Насколько мне известно, в Automator нет ничего лучше, чем простой поиск и замена, что, если вы использовали Automator, требует вечности для настройки и было бы довольно бессмысленным в этом случае, мне все равно пришлось бы вносить изменения в числовую последовательность вручную. Automator хорош для действительно простых вещей, я еще не нашел ему хорошего применения, часто пытался что-то сделать, но ему не хватает мощности Applescript. (Я знаю, что вы можете поместить AppleScript в Automator, но это как бы лишает смысла.)   -  person Sam Wise    schedule 18.02.2012


Ответы (2)


Вот еще один подход.

property pictureFolder : (alias "Mac OS X:Users:Sam:Pictures:test:")
property findList : {"Yellowst.Nat.Park", "Jellyst.Nat.Park"}
property replaceList : {"Yellowstone National Park", "Jellystone \\& National Park"}

tell application "System Events"
set nameList to (name of every file of pictureFolder whose visible = true)
repeat with i from 1 to count of (list folder pictureFolder without invisibles)
    set fileName to item i of nameList
    set fileExtension to (name extension of (file fileName of pictureFolder))

    repeat with j from 1 to count of findList
        if fileName contains item j of findList then
            set tempName to do shell script "echo " & fileName & " | sed 's/.D\\([0-9][0-9]\\)P\\([0-9][0-9]\\).*/[\\1x\\2] " & i & "." & fileExtension & "/'"
            set tempName to do shell script "echo " & tempName & " | sed 's/^" & item j of findList & "/" & item j of replaceList & " /'"
            set name of (file fileName of pictureFolder) to tempName
            exit repeat
        else if j = (count of findList) then
            set tempName to do shell script "echo " & fileName & " | sed 's/[.]/ /g'"
            set tempName to do shell script "echo " & tempName & " | sed 's/.D\\([0-9][0-9]\\)P\\([0-9][0-9]\\).*/ [\\1x\\2] " & i & "." & fileExtension & "/'"
            set name of (file fileName of pictureFolder) to tempName
        end if
    end repeat
end repeat
end tell

Чтобы избежать дублирования имен, я добавил счетчик в конец имени файла. Если нет дубликатов, вы можете использовать это вместо этого:

set tempName to do shell script "echo " & fileName & " | sed 's/.D\\([0-9][0-9]\\)P\\([0-9][0-9]\\).*/[\\1x\\2] " & "." & fileExtension & "/'"
person adayzdone    schedule 15.02.2012
comment
Спасибо, я на самом деле только что узнал, что сценарий tompaman вызывает проблему, когда в первой части есть слово, начинающееся с буквы D. - person Sam Wise; 17.02.2012
comment
Это связано с тем, что не во всех изображениях есть строка, требующая полной замены, в значительной части из них просто нужно заменить точки на пробелы, этот скрипт, к сожалению, просто пропускает их. Я могу добавить их все в список, но это частично лишило бы смысла пытаться выиграть время с помощью этого сценария. И когда скрипт запускается для файлов, которые уже были изменены, он добавляет дополнительный пробел перед числовым шаблоном для тех, которые заменяются сами по себе (то же слово в поиске, что и замена) - person Sam Wise; 17.02.2012
comment
Я обновил скрипт, заменив точки пробелами, если ни одно из условий списка поиска не совпадает. - person adayzdone; 18.02.2012
comment
Я хотел продолжить очистку папки с фотографиями и понял, что скрипт делает что-то, чего я не знаю почему. Он запускает часть else, несмотря на то, что строка находится в findList. - person Sam Wise; 25.02.2012
comment
Получилось, спасибо. Один быстрый вопрос, если вы не возражаете, что мне заполнить replaceList{}, если я хочу амперсанд? Использование обычного амперсанда теперь вызывает дублирование нужного амперсанда (XXXYYY -> XXX&YYY-> XXX XXXYYY YYY). Использование \& — это то, что обычно используется с sed, но не принимается AppleScript (ожидается «», но найден неизвестный токен.) - person Sam Wise; 29.02.2012

Мне нравятся такие маленькие вызовы, как этот Сэм. Они забавны для меня... может быть, я болен ;). Во всяком случае, я написал вам обработчик для очистки имени файла, как вы просили. На самом деле несложно манипулировать текстом в applescript, если вы знакомы с разделителями текстовых элементов и т.п. Эти небольшие задачи поддерживают мои навыки работы с текстом.

ПРИМЕЧАНИЕ. В свойстве nameList имя должно заканчиваться точкой или любым другим символом непосредственно перед буквой D в числовой последовательности DxxPxx, как вы упомянули.

Так что попробуйте. Подключите различные имена файлов и убедитесь, что они работают так, как вы хотите. Конечно, вам также нужно поместить больше значений в свойства nameList и nameReplaceList.

property nameList : {"Yellowst.Nat.Park."}
property nameReplaceList : {"Yellowstone National Park"}

set fileName to "Yellowst.Nat.Park.D12P55.DMS.3248.jpg"
cleanFilename(fileName)


(*================ SUBROUTINES ================*)
on cleanFilename(fileName)
    -- first find the base name and file extension of the file name
    set tids to AppleScript's text item delimiters
    set ext to ""
    if fileName contains "." then
        set AppleScript's text item delimiters to "."
        set textItems to text items of fileName
        set ext to "." & item -1 of textItems
        set baseName to (items 1 thru -2 of textItems) as text
        set text item delimiters to ""
    else
        set baseName to fileName
    end if

    -- next find the pattern D, 2 numbers, P, and 2 numbers in the baseName
    set chars to characters of baseName
    set theSequence to missing value
    repeat with i from 1 to (count of chars) - 6
        set thisChar to item i of chars
        if thisChar is "d" and item (i + 3) of baseName is "p" then
            try
                set firstNum to text (i + 1) thru (i + 2) of baseName
                firstNum as number
                set secondNum to text (i + 4) thru (i + 5) of baseName
                secondNum as number
                set theSequence to text i through (i + 5) of baseName
                exit repeat
            end try
        end if
    end repeat

    -- now make the changes
    if theSequence is not missing value then
        set AppleScript's text item delimiters to theSequence
        set theParts to text items of baseName
        set fixedFirstPart to item 1 of theParts
        repeat with i from 1 to count of nameList
            if item i of nameList is fixedFirstPart then
                set fixedFirstPart to item i of nameReplaceList
                exit repeat
            end if
        end repeat
        set fixedName to fixedFirstPart & " [" & firstNum & "x" & secondNum & "]" & ext
    else
        set fixedName to fileName
    end if

    set AppleScript's text item delimiters to tids
    return fixedName
end cleanFilename

Теперь, если вы хотите автоматизировать это для папки, полной файлов, вы можете использовать этот код. Просто замените строки 3 и 4 приведенного выше скрипта на это. Я не проверял этот код, но он достаточно прост и должен работать как есть.

ПРИМЕЧАНИЕ: вам не нужно беспокоиться, если файлы, не являющиеся изображениями, находятся в папке, которую вы выбираете с помощью этого кода, потому что они не будут (я предполагаю это) иметь числовую последовательность DxxPxx, и поэтому этот скрипт не изменит их ни в коем случае. способ.

set theFolder to choose folder
tell application "Finder"
    set theFiles to files of theFolder
    repeat with aFile in theFiles
        set thisName to name of aFile
        set newName to my cleanFilename(thisName)
        if newName is not thisName then
            set name of aFile to newName
        end if
    end repeat
end tell
person regulus6633    schedule 15.02.2012