0

誰かが私を助けてくれることを願って、

まず第一に、私の AppleScript スキルはほとんど存在しません。

アーカイブ目的で、並べ替えが必要な次の形式のファイルを多数取得します。形式は、最初にデバイス名、その後に実行番号、サンプル番号、テキストが続きます。

サンプル ファイル: "UZLA 55879 [05x13] september cal run.cdf" (ファイル形式は異なります) 次のフォルダーに移動する必要があります: ~/UZLA 55879 (LCMS)/Run 5/

  • デバイス名はかなりランダムで、数字だけの場合もあれば、正式な名前全体の場合もあります。
  • メイン フォルダには、デバイス名の後に括弧で囲まれた 2 番目の項目がありますが、これは移動中のファイル名には含まれていません。"[" と "(" の前の文字列は一致しますが、メインの名前の後の文字列は異なります。
  • サブフォルダーは常に存在するとは限りません。たとえば、新しい実行が開始されたときにフォルダー /Run 6/ が存在しない場合があります。数字に0のパディングはありません
  • ファイルはすべて同じフォルダーに到着し、そのフォルダーに他のファイルがあってはなりません。

これをまとめるために、直接アクセスできるように、メイン ドライブ (ファイルは外部システムに移動されます) の 1 つのフォルダーにエイリアスを作成します。他のスクリプトによって削除されます)。

ありがとう。


さて、これは厄介なことに閉じられました。見た目は私だけを助け、未来からのランダムな人ではありません。私のために助けを得ることがポイントでした。adayzdone のおかげで、これが現在の状況です。

set myFolder to (choose folder)
tell application "System Events" to set folderName to myFolder's name
set {TID, text item delimiters} to {text item delimiters, {"(", ")"}}
set myText to text item 2 of folderName
set text item delimiters to TID

set myFiles to every paragraph of (do shell script "find " & quoted form of (POSIX path of myFolder) & " \\! -name \".*\" -type f")
repeat with aFile in myFiles
    set aFile to aFile as text
    tell application "Finder" to set fileName to name of (POSIX file aFile as alias)
    set newPath to "~/" & quoted form of (do shell script "echo " & quoted form of fileName & " | sed -e 's/\\[0/\\[/' -e 's/\\([^\\[]*\\)\\[\\([0-9]*\\)x[0-9]*\\].*/\\1(" & myText & ")\\/Run \\2\\//'") as text
    do shell script "mkdir -p " & newPath & " ; mv " & quoted form of aFile & space & newPath
end repeat

これにより、次のエラーが発生します: エラー「\"testFolder\" のテキスト項目 2 を取得できません。」「testFolder」のテキスト項目 2 から数値 -1728


明確にさせてください: /testFolder/ という名前のフォルダーにたくさんのファイルがあります (常にその名前が付けられ、すべてのファイルがここに入力されます) 必要なのは、ファイル名に基づいて特定の形式でファイルをフォルダーとサブフォルダーに移動することです。

例: ファイル: /UZLA 55879 [01x05] XXX.cdf

  • ベース名「UZLA 55879」、移動先にフォルダ/UZLA 55879(LCMS)/が存在します。(LCMS) は移動とは関係ありません。フォルダー名に余分なジャンクが含まれているだけです。スクリプトは、フォルダーが存在することを検出する必要があります (() の間にジャンクが含まれているにもかかわらず)"、それを移動先として使用します。そのベースのフォルダーがない場合新しいベース名が作成されることはめったになく、とにかく手動で (そしてかなりランダムに) 名前が付けられるため、これは実際には問題ではありません。
  • 名前の 2 番目の部分は [01x05] です。その最初の部分である "01" が検出され (パディング ゼロから取り除かれ)、サブフォルダー /Run 1/ に移動されます ("[05x07] の場合は /Run 7/ に移動します)。ファイル名/拡張子の残りの部分は、移動には関係ありません。

現在の問題: スクリプトは開始フォルダーから情報を取得して宛先フォルダーを選択しようとします。開始フォルダーの名前は (ではなく) /UZLA 55879 (LCMS)/ その「LCMS」を使用して宛先フォルダーを作成します。(開始フォルダーが1)その名前が付けられていないため、これはできません。2))すべての宛先フォルダーには、それらの括弧の間に異なるアイテム(一部は同じですが)があるため、開始フォルダーにそのような名前を付けることは役に立ちません。スクリプトはそのために「 & myText & 」を使用します。その文字列は、開始フォルダーではなく宛先フォルダーによって定義されるランダムな文字列でなければなりません。

4

1 に答える 1

0

ユーザーが何らかの努力を払わない限り、通常、このような質問には答えませんが、私は正規表現が大好きです。

set sourceFolder to "/Users/You/Desktop/testFolder"
set destFolder to "/Users/You/Desktop/testFolder2"

set myFiles to every paragraph of (do shell script "find " & quoted form of sourceFolder & " \\! -name \".*\" -type f")

repeat with aFile in myFiles
    set aFile to aFile as text
    tell application "Finder" to set fileName to name of (POSIX file aFile as alias)

    -- Find name of parent folder
    set parentName to do shell script "echo " & quoted form of fileName & " | sed 's/ \\[.*//'"
    tell application "System Events" to set parentFolder to POSIX path of (first folder of folder destFolder whose name starts with parentName)

    -- Extract the text between ( and ) 
    set myText to do shell script "echo " & quoted form of parentFolder & " | sed 's/.*(\\(.*\\)).*/\\1/'"

    set newPath to quoted form of (destFolder & "/" & (do shell script "echo " & quoted form of fileName & " | sed -e 's/\\[0/\\[/' -e 's/\\([^\\[]*\\)\\[\\([0-9]*\\)x[0-9]*\\].*/\\1(" & myText & ")\\/Run \\2\\//'") as text)

    do shell script "mkdir -p " & newPath & " ; mv " & quoted form of aFile & space & newPath
end repeat
于 2012-10-04T22:13:30.513 に答える