Повторное переименование Applescript - PullRequest
0 голосов
/ 15 февраля 2012

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

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

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

В основном я хочу перейти от "Yellowst.Nat.Park.D12P55.DMS.3248.jpg" к "Йеллоустонский национальный парк [02x03] .jpg" Я хочу добавить текст, поэтому хочу заканчиваться пробелом.

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

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Вот другой подход.

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 & "/'"
0 голосов
/ 15 февраля 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 приведенного выше сценария этим.Я не проверял этот код, но он достаточно прост, он должен работать как есть.

ПРИМЕЧАНИЕ: вам не нужно беспокоиться о том, что файлы без изображений находятся в папке, которую вы выбрали с этим кодом, потому что они выиграли't (я предполагаю это) имеет числовую последовательность 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...