LoginSignup
1
2

More than 3 years have passed since last update.

Mac の Automator で「親フォルダ名_連番」の一括リネームを行う

Posted at

はじめに

iMac 2011 mid がトラブルに見舞われ M1 mini を購入し、とうとう Sandy おじさんを卒業する事となったが、前準備なく 32bit アプリケーション難民となったため代替アプリ探しに四苦八苦していた。

高機能リネームソフト Shupapan もそのひとつで、ある程度は Path Finder 付属のリネーム機能で代用できたが、親フォルダ名を使ったリネームは Path Finder には無かった。(サイト製作時、パーツ毎に連番画像を作る際などに便利)
Shupapan 代替として紹介されているいくつかのアプリはその機能を備えていたが、残念ながら動作など今ひとつしっくり来るものが無かった。

そこで macOS 標準の自動化機能作成アプリ Automator である。

こんな仕上がり

  • リネームしたいファイルの入ったフォルダを選択してコンテクストメニューから実行
  • 複数のフォルダに対する同時実行が可能
  • フォルダの入れ子には非対応(入れ子フォルダの中は無視される)
  • プレビューやアンドゥなど気の利いた機能は無いので、慎重に扱うファイルは複製後の実行を推奨
  • 数十程度なら問題無いが、フォルダ・ファイル数が増えると重いのであくまで簡易的なもの

Automator で製作する

Automator の基本的な解説は図解入りの分かりやすいページが多く存在しているので省略。
複数のフォルダを選択した際の動作のために2段階で処理を行う形となる。
設定やスクリーンショットは ver.2.10 (509) のもの。

コア部分:リネーム処理本体

新規書類で「ワークフロー」を下記の通り作成して保存する。
ここで作成したものを次で呼び出す。

  • シェルスクリプトの内容は basename "$1"
  • 各変数はテキスト形式
  • 「Finder項目を並べ替える」や「Finder項目の名前を変更」のオプション「ワークフローの実行時にこのアクションを表示」をオンにするとリネーム時にダイアログが表示されるので、作成の古いものから連番にする、今回は数値を4桁揃えにするなど、その都度調整可能な汎用型を作る事もできる
  • リネーム対象を限定したい場合は「Finder項目を並べ替える」の前に「Finder項目にフィルタを適用」を追加してフィルタリングを行う 1

am_001.png

実行部分:先程のワークフローをバッチで実行

こちらがコンテクストメニューの表示名になるので、分かりやすい名前をつける。
新規書類で「クイックアクション」を下記の通り作成して保存する。
なおクイックアクションは /Users/ユーザ名/Library(隠しフォルダ)/Services/ に保存される。

  • Path Finder など標準以外のファイルブラウザを利用している場合は、検索対象を「すべてのアプリケーション」または自分が利用しているファイルブラウザにしないとコンテクストメニューに表示されないので注意。

am_002.png

「使用するワークフロー数」について

この数値は複数のフォルダに対して実行した際の「リネーム処理の『初回』同時実行数」となる。
内部処理を追った訳ではなく挙動を観察した上での推測となるが、複数実行の場合「親フォルダ名の収集や並び替え等の前処理 → 各フォルダ内のファイルを実際にリネーム」の順番で処理が行われていると思われる。
そして後者のリネーム処理は「まずワークフロー数と同じ数のフォルダ内のファイルを一気にリネーム、それ以降は1フォルダづつリネーム」という流れになるようだ。
超過分は1つづつの処理となるため16にしているが、同時実行の予定があまり無いなら小さくても構わないと思う。

Automator メモ

製作中に気づいたことのメモ。
Automator を触るのは今回がほぼ初めてで、触った感じこれっぽい的な内容なので勘違いなどあるかも。ver. 2.10 (509) における話で、バージョンによって挙動が違う可能性もあるので注意。

  • Finder でファイルを選択した状態でサービスメニューを起動した場合、Automator はそのファイルのパスを取得した状態から処理を開始する。
  • そのため、最初に「選択された Finder項目を取得」を置く必要はない。
  • 同様にパス取得のために何か処理を行う必要はなく「変数の値を設定」「クリップボードにコピー」などで、そのままパスを取り出す事ができる。2
  • Automator は最初に取得したパスを対象に処理を行うため、それを変更した場合は対象項目を再指定する必要がある。3
  • 対象項目の再指定は「選択されたFinder項目を取得」で可能 4 で、ひとつのワークフローで処理が完結するならその方法で問題ないが、今回のように別のフローから呼び出してバッチ処理させた場合は挙動がおかしくなるため「パスを変数へ格納 → その変数を呼び出す」形式で対象項目を再指定する必要がある。

おまけ:同階層のファイルを「定型_連番」にリネーム

同じフォルダ内のファイルを定型連番にリネームしたい場合に。
選択したファイルではなく、同階層のファイル・フォルダを全てリネームするので注意。
新規書類で「クイックアクション」を下記のように作成して保存する。

  • シェルスクリプトの内容は dirname "$1"
  • リネーム対象を限定したい場合は「Finder項目を並べ替える」の前に「Finder項目にフィルタを適用」を追加してフィルタリングを行う 1

am_003.png


  1. フィルタリングには Spotlight 情報を利用するため、リネームしたいファイルが「システム環境設定 > Sporlight > プライバシー」に登録されている場所にある場合はリネームを実行できないので注意。 

  2. 例えば「クリップボードにコピー」を1つ置くだけで選択項目のパスをコピーするサービスメニューを作る事ができる。 

  3. 今回の場合シェルスクリプトでパスをファイル名に変換した時点で Automator は現在位置を見失う形となる。これに気づかずしばらくハマった。 

  4. ただし Path Finder など macOS 標準以外のファイルブラウザの場合、この方法では再指定する事はできない。 

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2