0

AppleScript ドロップレットを作成して、迷惑な形式の画像の名前を変更しようとしていますが、AppleScript のスキルが存在しなくなり、どこにも行き着いていないことがわかりました。したがって、可能であれば、スニペットだけでなく完全なコードを提供してください。

ファイルの設定は常に同じですが、さまざまなバリエーションがあります (例: Yellowst.Nat.Park.D12P55.DMS.3248.jpg)。

  • 地名で始まり、さまざまな文字列を検索して置換する必要があります ("Yellowst.Nat.Park" -> "Yellowstone National Park")
  • 次に、形式を変更する必要がある 2 つの数値が続きます (D12P55 -> [12x55])。それらは常に「D」の後に 2 つの数字、「P」、そして再び 2 つの数字が続く形式で設定されます。
  • そして、それはランダムな文字列で終わり、数字、文字などである可能性があり、すべて行かなければなりません。それらは形式と長さが異なり、パターンはありません。

基本的には「Yellowst.Nat.Park.D12P55.DMS.3248.jpg」から「Yellowstone National Park [02x03].jpg」に行きたいのですが、あとからテキストを追加したいのでスペースで終わりたいです。

これを行うための最良の方法は、最初の部分の検索と置換を繰り返すことのように思えます。それぞれの用語の束に置き換える必要がある一連の用語のリストを作成します。数値形式の検出が続き、その後のランダム文字列の削除で終了します。

4

2 に答える 2

1

ここに別のアプローチがあります。

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 & "/'"
于 2012-02-15T19:05:48.470 に答える
0

このサムのような小さな挑戦が好きです。彼らは私にとって楽しいです...多分私は病気です;)。とにかく、あなたが要求したようにファイル名をきれいにするハンドラを書きました。テキスト項目の区切り記号などに慣れていれば、AppleScript でテキストを操作するのはそれほど難しくありません。これらの小さな課題が、私のテキスト スキルを鋭く保ちます。

注: nameList プロパティでは、名前は、ピリオドまたは番号シーケンス DxxPxx の文字 D の直前にある任意の文字で終了する必要があります。

だからこれを試してみてください。さまざまなファイル名をプラグインして、希望どおりに機能することを確認します。もちろん、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
于 2012-02-15T17:22:23.177 に答える