このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

複数のファイル名を一気に変更したいのですが

発言者:坂西
( Date Tuesday, November 21, 2000 21:29:18 )


複数の類似したファイル名をバッチで一気に変更したいのですが、何か簡単な方法はありませんか?
具体的に言うと、『???−???.txt』(?にはそれぞれ異なった文字が入っています)と、”−”が含まれている複数のファイル名がありまして、これらのファイルを『???#???.txt』と言うふうに”−”の部分を、ある文字”#”に変更したいのです。
一応自分なりに考えたところ、
1.ファイル名に”−”を含むファイルを検索し、それをあるフォルダにリストアップする。
2.そのフォルダ内の各ファイル名の”−”の部分をファイル名から探し出し、その部分だけを”#”に変更していく。
と、言った手順で実現可能ではないかという案が出てきましたが、これをAppleScriptで組むとなるとそう簡単なものではなかったのです。
なにぶん初心者ですので、分かりやすいご回答をよろしくお願いします。

yabuki さんからのコメント
( Wednesday, November 22, 2000 09:28:40 )

> 具体的に言うと、『???−???.txt』(?にはそれぞれ異なった文字が入っています)と、
>”−”が含まれている複数のファイル名がありまして、これらのファイルを
>『???#???.txt』と言うふうに”−”の部分を、ある文字”#”に変更したいのです。

???の文字数(またはバイト数)は一定なのですか?
もし違う場合ファイル名に『−』が付いているのかをチェックする必要があると思います。
一定の場合、たとえば左から4文字目が『−』と決まっていれば、条件をそのようにして
scriptを記述すればよいです。

> ファイル名に”−”を含むファイルを検索し、それをあるフォルダにリストアップする。

上記の条件で直接ファイル名を変更した方が早いと思いますよ。

野本夏俊 さんからのコメント
( Wednesday, November 22, 2000 09:32:40 )

基本的には以下のようなスクリプトでできます。

on open FOLs
  repeat with i in FOLs
    Doit(i)
  end repeat
end open

on Doit(FOL)
  set MyFiles to MT List Files FOL name contains "-" return as string with sub folders
  set MyNames to item 1 of (MT Parse ツ
    (MT Replace ツ
      (MT Join List MyFiles line delimiter "::*::") ツ
        search "-" replace "#") ツ
      item delimiter "::*::")
  set AppleScript's text item delimiters to ":"
  tell application "Finder"
    repeat with i from 1 to count MyFiles
      set name of item (item i of MyFiles) to (text item -1 of (item i of MyNames))
    end repeat
  end tell
end Doit

やってみればわかりますが相当時間がかかります。
後は自分で工夫してみた方がよいでしょう。

坂西 さんからのコメント
( Wednesday, November 22, 2000 09:36:53 )

yabukiさん、ありがとうございます。
???の文字数は一定ではありません。
それと面倒かと思いますが、もしよろしければ、
今のこの処理に必要なコマンド(script)等が解説付きで掲載されている、
Webページとかご存知であればご教授ください。
よろしくお願いします。

坂西 さんからのコメント
( Wednesday, November 22, 2000 09:44:57 )

野本夏俊さんありがとうございます。
大変役に立たせて頂きます。
しかし、これからAppleScriptを学んでいく上で理解せずに、
これをそのまま用いるのは自分のために良くないと思います。
そこで恐縮ですがもしよろしければ、どういう構文なのかを
解説して頂けないでしょうか?
お時間のあるときで結構です。
よろしくお願いします。

野本夏俊 さんからのコメント
( Wednesday, November 22, 2000 10:53:13 )

他人のスクリプトがどういうふうに動いているのかを考えるのが勉強ってモンです。
解説する気はありません。自分で何とかしてください。

坂西 さんからのコメント
( Wednesday, November 22, 2000 12:09:05 )

分かりました。
野本さんのおっしゃるとおりです。
甘えてました、申し訳ありません。
自分で何とかしてみます。
ありがとうございました。

今井真人 さんからのコメント
( Wednesday, November 22, 2000 14:19:29 )

 うまくいくかどうかわかりませんが、以下のようなソフトもあります。

→  名前カエルぴょん

yabuki さんからのコメント
( Wednesday, November 22, 2000 15:01:03 )

自分なりに作ってみました。(自分の勉強に)
↓

on open FirstObject
  set text item delimiters of AppleScript to ":"
  set filePath to FirstObject as string
  if ((last character of filePath) = ":") then
    repeat with thePath in FirstObject
      my DiveFolder(thePath)
    end repeat
  else
    set FileName to last text item of filePath
    beep of 3
    display dialog ("「" & FileName & "」はフォルダではありません。
    変更したいファイルのあるフォルダを
    ドラッグしてください。")
  end if
end open

on DiveFolder(thePath)
  tell application "Finder"
    set theFiles to every file of thePath
    repeat with aFile in theFiles
      if file (aFile as string) exists then
        select file (aFile as string)
        set OriginalName to (name of aFile) as string
        set character_num to (get number of every character of OriginalName)
        ---ファイル名の文字数を取得
        set character_num2 to character_num
        ---ファイル名の文字数を別の変数に取得(あとで使います)
        repeat
          set CheckCharacter to character (character_num) of OriginalName
          if (CheckCharacter = "-") then ---変更したい文字列の条件文
            set Check_num to character_num ---変更したい文字列が何番目なのかを取得
            set F to 1 ---変更したい文字列がファイル名に存在するならばFを1にします
            exit repeat
          else
            set F to 0 ---変更したい文字列がファイル名に存在しないならばFを0にします
            ---記述しなくてもよいような気がしますが、取ってしまうと
            ---if (F = 1) thenでFの変数が指定していないというエラーがでてしまいます
          end if
          set character_num to (character_num - 1)
          if (character_num = 0) then exit repeat ---存在しない場合にループから抜け出す
        end repeat
        if (F = 1) then
          set beforeName to text 1 thru (Check_num - 1) of OriginalName 
          ---変更する文字列の前部分
          set afterName to text (Check_num + 1) thru character_num2 of OriginalName 
          ---変更する文字列の後部分
          set OriginalName to (beforeName & "#" & afterName) as string 
          ---変更したい名前
          set name of selection to OriginalName
        end if
      end if
    end repeat
    
    set theFolders to every folder of thePath
    repeat with aFolder in theFolders
      DiveFolder(aFolder) of me
      ---フォルダの中にフォルダがあって、その中にファイルがある場合の処理
    end repeat
  end tell
end DiveFolder

これをアップレットで保存して、変更したいファイルをフォルダに入れて
ドラッグ&ドロップして下さい。

script処理の詳細 ↓
ファイル名に「-」があったら「#」に変更する。
「-」が複数ついていたら、後ろの方を1つだけ「#」に変更する。
例)ファイル名「○-○-○」→「○-○#○」
また1バイトの文字を2バイト文字に置き換える場合は
ファイル名のバイト数を取得しないとエラーになる場合があります。
(Finder上でのファイル名の上限が31バイトなので)

簡単な説明といらないかもしれないダイアログ表示を入れておきました。
邪魔になれば削除して下さい。

坂西 さんからのコメント
( Wednesday, November 22, 2000 17:34:47 )

yabukiさん、どうもありがとうございました。
特に解説付きというのはありがたいです。
早速使わせて頂きます。
本当にありがとうございました。

坂西 さんからのコメント
( Wednesday, November 22, 2000 17:41:20 )

今井真人さん、ありがとうございました。
このソフトもどうやら使えそうなので、
早速試してみようかと思います。
本当にありがとうございました。