3

番号のプレフィックスが3桁になるように、サブフォルダー内のファイルの名前を変更する必要があります。

名前のパターンは次のとおりです。1AudioTrack.aiff2AudioTrack.aiffなど...

私は何をすべきかを理解しようとしましたが、これまでのところ、しっかりとした頭痛を感じることができました。

すべての助けに感謝します。

ps。私はこのサブルーチンを見つけましたが、私のスクリプトスキルは悲しいことにそれをうまく利用するのに欠けています。

on add_leading_zeros(this_number, max_leading_zeros)
 set the threshold_number to (10 ^ max_leading_zeros) as integer
 if this_number is less than the threshold_number then
 set the leading_zeros to ""
 set the digit_count to the length of ((this_number div 1) as string)
 set the character_count to (max_leading_zeros + 1) - digit_count
 repeat character_count times
 set the leading_zeros to (the leading_zeros & "0") as string
 end repeat
 return (leading_zeros & (this_number as text)) as string
 else
 return this_number as text
 end if
end add_leading_zeros
4

6 に答える 6

2

私はもっ​​と簡単な解決策を求めます:

on add_leading_zeros(this_number, max_leading_zeros)
    return text (max_leading_zeros * -1) thru -1 of ("00000000000000000" & this_number)
end add_leading_zeros
于 2013-02-28T13:41:01.297 に答える
2

試す:

on add_leading_zeros(this_number, max_leading_zeros)
    return (do shell script "printf \"%0" & max_leading_zeros & "d\"" & this_number)
end add_leading_zeros

set xxx to add_leading_zeros(5, 2)

または、テキストを含めるには:

on add_leading_zeros(maxPrefix, myString)
    set this_number to (do shell script "grep -Eo ^[0-9]* <<< " & quoted form of myString)
    set extraZeros to maxPrefix - (length of this_number)
    if extraZeros > 0 then
        set myNumber to (do shell script "printf \"%0" & extraZeros & "d\"" & this_number)
        set myText to myNumber & (do shell script " sed 's/^[0-9]*//' <<< " & quoted form of myString)
    end if
end add_leading_zeros

set xxx to "4441 Audio Track.aiff"
set xxx to add_leading_zeros(6, xxx)
于 2013-02-26T12:36:40.113 に答える
1

問題をいくつかのステップに分けてみましょう。

まず、ファインダーからファイルを取得します。今のところ、フォルダが選択されていて、その囲まれたファイルにスクリプトを適用したいとします。

tell application "Finder"
    set theFolder to the selection
    set theFiles to every file of item 1 of theFolder

Finderの選択を取得すると、リスト、つまり項目1が表示されます。これにより、たとえば、複数のフォルダーを選択し、繰り返しループを使用してそれらを反復処理することにより、リストを広げることができます。

次に、すべてのファイルを調べたいので、関数を呼び出して、現在のファイルのファイル名を文字列として渡すループを設定しましょう。

repeat with aFile in theFiles
    set originalName to the name of aFile
    set newName to my threeDigitPrefix(originalName)

私たちが呼び出すサブルーチンは非常に単純なもので、ファイル名の文字列を分解してリストに格納することから始まります。

set AppleScript's text item delimiters to " "
set splitName to (every text item of originalName) as list

次に、ファイル名が数字で始まっていることを確認し、数字でない場合は関数から抜け出します。

try
    first item of splitName as number
on error
    return "FAILED" -- originalName does not start with a number
end try

次に、既存のプレフィックスを変数に割り当て、その長さをチェックして、ファイル名に追加する必要のあるゼロの数を決定します。

set thePrefix to the first item of splitName

if the length of thePrefix is 1 then
    set thePrefix to "00" & thePrefix
else if the length of thePrefix is 2 then
    set thePrefix to "0" & thePrefix
end if

次に、プレフィックスを分割されたファイル名を含むリストに戻し、それを再結合して、それを呼び出したループに戻します。

set the first item of splitName to thePrefix
return splitName as string

最後に、関数が失敗しなかったことを確認し、関数から取得した文字列でファイルの名前を変更します。

if newName is not "FAILED" then
    set the name of aFile to newName
end if

これで完了です。すべてをまとめると、次のようになります。

tell application "Finder"
    set theFolder to the selection
    set theFiles to every file of item 1 of theFolder

    repeat with aFile in theFiles
        set originalName to the name of aFile
        set newName to my threeDigitPrefix(originalName)

        if newName is not "FAILED" then
            set the name of aFile to newName
        end if
    end repeat
end tell

on threeDigitPrefix(originalName)
    set AppleScript's text item delimiters to " "
    set splitName to (every text item of originalName) as list

    try
        first item of splitName as number
    on error
        return "FAILED" -- originalName does not start with a number
    end try

    set thePrefix to the first item of splitName

    if the length of thePrefix is 1 then
        set thePrefix to "00" & thePrefix
    else if the length of thePrefix is 2 then
        set thePrefix to "0" & thePrefix
    end if

    set the first item of splitName to thePrefix
    return splitName as string

end threeDigitPrefix
于 2013-02-26T12:43:38.120 に答える
1

ここでは、サブルーチンの使用法を示します。ログステートメントを追加して、それがどのように機能するかを確認できるようにしました。それが役に立てば幸い:

set thisFilename to "1 Audio Track.aiff"

log "thisFilename: " & thisFilename
set numberPrefix to (first word of thisFilename) as number
log "numberPrefix as number: " & numberPrefix

set numberPrefixWithLeadingZeros to my add_leading_zeros(numberPrefix, 2)
log "numberPrefixWithLeadingZeros as text: " & numberPrefixWithLeadingZeros

set newFileName to numberPrefixWithLeadingZeros & " Audio Track.aiff"
log newFileName


-- ADDING LEADING ZEROS: place leading zeros (0001, 023, etc.) before a number
-- if the maximum number of leading zeros is set to 2, then the results will range from 001 to 999, and so on.
on add_leading_zeros(this_number, max_leading_zeros)
    set the threshold_number to (10 ^ max_leading_zeros) as integer
    if this_number is less than the threshold_number then
        set the leading_zeros to ""
        set the digit_count to the length of ((this_number div 1) as string)
        set the character_count to (max_leading_zeros + 1) - digit_count
        repeat character_count times
            set the leading_zeros to (the leading_zeros & "0") as string
        end repeat
        return (leading_zeros & (this_number as text)) as string
    else
        return this_number as text
    end if
end add_leading_zeros
于 2013-02-26T12:27:36.373 に答える
1

シェルスクリプトを使用することもできます:

for f in *.aif; do mv "$f" "$(printf %03d "${f%% *}") ${f#* }"; done

これは、現在のフォルダーの下にあるすべてのファイルを検索します。

IFS=$'\n'; for f in $(find "$PWD" -name '*.aif'); do folder=${f%/*}; file=${f##*/}; mv "$f" "$folder/$(printf %03d "${file%% *}") ${file#* }"; done

  • %%最長のパターンを最後から#削除し、最短のパターンを最初から削除します
  • IFS=$'\n'入力フィールドのセパレーターを、スペース、タブ、および改行の代わりに改行に設定します
于 2013-02-26T15:51:45.213 に答える
0

ワークフローの変更に対応するためにスクリプトを変更しました。私は現在、aif ファイルタイプの代わりに mp3 ファイルの名前を変更しています。また、新しいファイル名に親フォルダー名のプレフィックスを付けています。

スクリプトは次のようになります。

IFS=$'\n'; for f in $(find "$PWD" -name '*.mp3'); do folder=${f%/*}; file=${f##*/}; mv "$f" "$folder/${folder##*/}$(printf %03d "${file%% *}") ${file#* } " ;done

しかし、私はトラブルに遭遇しました。フォルダーに 10 個を超えるファイルが含まれている場合、(特定の条件下で!) 問題があるようです。

2 つの異なるファイル タイプ .docx ファイルと .mp3 ファイルを使用して 2 つのテスト ケースを設定しました。テスト ケースは基本的に、それぞれに 10 個のファイルを含む 10 個のサブフォルダーです。ファイルは次のパターンに従って名前が付けられます。奇妙な結果が得られたようです。.docx ファイルの場合は正しい結果が得られますが、mp3 ファイルを使用してまったく同じフォルダーとファイル構造を設定すると、10 個以上のファイルを含むすべてのフォルダーで奇妙な結果が得られます。000 Audio Track.mp3 に名前が変更されたファイルを取得しましたが、これは奇妙で、008 および 009 であるはずのファイルが存在しません。私はこれを引き起こす可能性があるものについて完全に無知です。

于 2013-02-27T15:04:30.283 に答える