mac ファイル名一括変更コマンドの使い分け|zmvとforループ

mac ファイル名一括変更コマンドで検索してたどり着く記事の多くは、正規表現の書き方から話が始まります。ところが実際に手が止まる場所は、そこではありません。「どのコマンドを使えばいいのか」「実行前に結果を確かめる方法があるのか」「失敗したら戻せるのか」の3つで止まっている場合がほとんどです。この記事は、書き方の前に置くべき判断と、Macに最初から入っている道具の範囲を先に整理します。

コマンドに移る境目は、規則を1行で言い切れるかどうか

Finderの一括変更に用意されているのは、テキストの置き換え、テキストの追加、指定した形式への変更の3つです。ここに収まる作業であれば、コマンドを覚える必要はありません。境目を判断する問いは1つで足ります。「変える規則を、ファイルごとの中身を見ずに1行で言い切れるか」です。

「先頭に案件名を足す」「末尾の連番を3桁でそろえる」は言い切れます。一方で「名前の中にある日付部分だけを取り出して先頭に移す」は、日付の位置がファイルごとに違うため、取り出す規則を書かないと成立しません。この差がそのままコマンドへ移る境目になります。

もう1つの境目は回数です。今日だけの1回であれば、Finderで手を動かしたほうが早く終わります。同じ整理が毎週発生していて、毎回30件前後を手で直しているなら、書き方を覚える時間は数週間で回収できます。判断の軸は規則の難しさではなく、繰り返す回数のほうです。

Macに最初から入っているのは3つ

追加インストールなしで使える経路は3つあります。どれも標準のzshとBSD系のコマンドで動きます。

経路 追加インストール 条件を書けるか 空打ち確認 向いている場面
zmv 不要(zshに同梱) 書ける できる 名前の中身を組み替える
forループとmv 不要 書ける できる 前後に語を足す、削る
findとの組み合わせ 不要 書ける できる 階層の奥まで一気に処理する

Linuxの記事でよく出てくる rename コマンドは、macOSには標準で入っていません。Perl版のrenameを前提に書かれた手順をそのまま打つと command not found が返ります。ここで詰まって「Macでは一括変更できない」と結論づけてしまう人がいますが、実際には代わりになる道具がすでに入っています。

3つのうち、名前の中身を組み替える用途で最も手数が少ないのはzmvです。zshに付属するファイル名変更用の関数で、パターンの丸括弧で取り出した部分を変更後の名前に差し込めます。

zmvを使えるようにする2行

zmvは既定では読み込まれていないため、使う前に一度だけ有効にします。

autoload -Uz zmv
zmv -n '(*).txt' '2026-$1.txt'

1行目が関数の読み込みで、2行目が実際の指定です。丸括弧で囲んだ部分が $1 として変更後の名前に入ります。毎回打つのが面倒であれば、1行目を ~/.zshrc に書いておくと、以降のターミナルでそのまま使えます。

よく使う形をいくつか挙げます。

  • 先頭に語を足す。zmv -n '(*)' 'invoice-$1'
  • 末尾の語を削る。zmv -n '(*)のコピー.(*)' '$1.$2'
  • 拡張子だけを変える。zmv -n '(*).jpeg' '$1.jpg'
  • 大文字を小文字にそろえる。zmv -n '(*)' '${(L)1}'

zmvが強いのは、変換の規則を1行に閉じ込められる点です。forループで同じことをやろうとすると、パターンの切り出しと組み立てを別々に書くことになり、行数が増えます。

空打ちで結果を先に見る

一括変更で最も多い失敗は、意図と違う名前になったことに実行後まで気づかないことです。これは実行前に一覧を出せば防げます。

zmvであれば -n を付けると、動かす予定の対応表だけが表示され、ファイルには何も起きません。表示された内容を確かめてから -n を外します。

forループを自分で書く場合は、mv の手前に echo を置くと同じ効果になります。

for f in *.png; do echo mv "$f" "screen-$f"; done

画面に流れた mv の行が、そのまま実行される内容です。意図どおりであれば echo を外します。この一手間を挟むだけで、数十件の名前を巻き戻す作業が消えます。

「Finder項目の名前を変更」の下にあるポップアップメニューで、名前のテキストを置き換えるか、名前にテキストを追加するか、名前のフォーマットを変更するかを選択します。 出典: support.apple.com

Finderの側にも一括変更は用意されていますが、こちらは実行前の一覧表示がありません。代わりに実行直後であればCommandとZで取り消せます。事前に見るのがコマンド、事後に戻せるのがFinderという違いになります。

上書きで消えるのはどんなときか

コマンドでの一括変更で、取り返しがつかなくなる場面は1つに絞られます。変換の結果、複数のファイルが同じ名前になったときです。

macOSの mv は、既定では同じ名前のファイルがあっても確認せずに上書きします。しかも上書きされたファイルはゴミ箱を経由しません。Finderでのドラッグ操作では置き換えの確認が出るため、同じ感覚でコマンドを打つと差に気づきにくい部分です。

防ぎ方は2つあります。

  • mv -n を使う。同名のファイルがある場合は移動せず、そのまま残します
  • 変換後の名前の一覧を作って重複を調べる。sort に通してから uniq -d に渡し、何も出力されないことを確かめます

zmvは既定で上書きを拒否し、衝突があればエラーで止まります。この点はzmvのほうが安全側に倒れています。上書きを承知で進めたい場合だけ -f を付けます。

大文字と小文字だけが違う名前も、衝突として扱われることがあります。macOSの標準のファイルシステムは初期状態で大文字と小文字を区別しないため、Report.pdfreport.pdf を同じフォルダに並べて置けません。全部を小文字にそろえる変換は一見無害ですが、元から大文字違いの同名ファイルが混ざっていると、そこで片方が消えます。実行前に ls | tr 'A-Z' 'a-z' | sort | uniq -d を通しておくと、その組み合わせだけを先に洗い出せます。

空白や記号を含む名前で失敗する原因

パターンを正しく書いたのに動かない、という相談の多くは、正規表現ではなく引用符の付け忘れが原因です。名前に空白が入っていると、シェルはそこで別の引数として区切ります。「会議 資料.pdf」という1つのファイルが、「会議」と「資料.pdf」という2つの指定として渡り、そんなファイルは無いと返ってきます。

ファイル名およびフォルダ名には、文字、数字、ピリオド、およびアンダースコア文字を含めることができます。その他のほとんどの文字(スペース文字など)は使用しないでください。一部のファイルシステムではそうしたその他の文字(スペースなど)の使用が許可されていますが、そうした文字を含むパス名は一重引用符または二重引用符で囲むことをお勧めします。 出典: support.apple.com

実務では名前を自分で決められないほうが多いはずです。受け取った資料も、書き出されたスクリーンショットも、空白や丸括弧が入っています。守る決まりは3つに絞れます。

  • 変数を展開するときは二重引用符で囲む。"$f" と書き、$f と裸で書かない
  • オプションの終わりを示す --mv の直後に置く。ハイフンで始まる名前をオプションと誤解されない
  • パターンは一重引用符で囲む。'(*).txt' と書き、シェルに先に展開させない

find から渡す場合は、区切りをヌル文字にする指定が使えます。find . -name '*.png' -print0xargs -0 を組み合わせれば、空白どころか改行を含む名前でも1件として渡ります。改行入りのファイル名は珍しく見えますが、Webから保存した資料には実際に混ざります。

拡張子と隠しファイルで起きる取りこぼし

パターンの書き方で起きる取りこぼしも、事故として数えられます。

* はzshの既定では隠しファイル(ドットで始まる名前)に一致しません。設定ファイルをまとめて扱いたい場合は、パターンを .* にするか、setopt globdots を有効にします。

拡張子まわりでは、(*) のような広いパターンで受けると、名前と拡張子の境目を意識せずに処理してしまいます。report.tar.gz のような二重拡張子を含むフォルダでは、意図した場所と違うところで切れることがあります。拡張子を保ったまま名前だけ変えたいときは、(*).(*) のように分けて受け、変更後に $1$2 を組み直すほうが安全です。

階層の奥まで対象にしたい場合、zshでは **/ を使うと再帰的にたどれます。ただし対象が一気に増えるため、-n での確認は省かないでください。findで拾うときは -depth を付けて、中身を先に処理してから入れ物を処理させます。これが無いと先にフォルダの名前が変わり、その中のファイルへのパスが途中で無効になります。

連番はゼロ埋めで桁をそろえる

通し番号を振る作業では、桁をそろえないまま 1, 2, 10 と付けると、名前順に並べたときに10が2の前に来ます。名前順で運用する前提なら、桁は最初から固定します。

i=1
for f in *.jpg; do
  printf -v n '%03d' "$i"
  echo mv -- "$f" "shooting-${n}.jpg"
  i=$((i + 1))
done

%03d は3桁になるように左をゼロで埋める書き方で、999件までなら足ります。それを超える見込みがあるなら最初から4桁にしておくほうが手戻りが減ります。桁を後から増やす作業は、既存の名前を全部つけ直すことと同じだからです。

順番そのものにも注意が要ります。*.jpg の展開は名前順であって、撮った順ではありません。時系列で番号を振りたい場合は、撮影日時を名前の先頭に置く形へ寄せるほうが確実です。名前順と時系列が一致すれば、以降の並べ替えで悩む場面そのものが消えます。

日本語のファイル名が置換にヒットしない理由

日本語のファイル名を扱っていて、目で見て一致しているはずのパターンが当たらないことがあります。原因のほとんどは濁点と半濁点の記録のされ方です。

macOSでファイル名として記録された文字は、濁点が本体の文字と分かれた形で並んでいる場合があります。画面上は1文字に見えても、内部では2文字として扱われるため、手で打った文字列とは一致しません。「ダウンロード」「プレゼン」のように濁点や半濁点を含む語をパターンに書いたときに起きやすい現象です。

回避の方法は次の2つです。

  • ファイル名から直接コピーして、パターンに貼り付ける
  • 濁点を含まない部分だけをパターンに使う。「ダウンロード」ではなく「ウンロ」で当てる

書いたパターンが当たらないときに、正規表現の書き方を疑って時間を溶かす人は少なくありません。日本語のファイル名を扱っているなら、まずこの可能性を先に潰すほうが早く終わります。

同じ処理を来月も使うなら、置き場所を決める

一度うまく動いた指定は、そのままターミナルの履歴に埋もれます。翌月に同じ作業が来たとき、履歴を遡って探す時間は、書き直す時間とあまり変わりません。

繰り返す前提であれば、置き場所を先に決めておくと効きます。よく使う変換を ~/bin の下に短いスクリプトとして置き、名前で呼び出せるようにする。あるいはzshの関数として ~/.zshrc に書いておく。どちらでも構いませんが、決めずに毎回その場で書くと、空打ち確認まで含めた手順ごと毎回やり直すことになります。

作業を人に引き継ぐ可能性があるなら、指定そのものより「どのフォルダの、どの条件のファイルに当てるのか」をメモに残すほうが重要です。コマンドは読めば分かりますが、適用範囲は書き残さないと伝わりません。

往復の回数を数えると、次に変える場所が見える

一括変更に時間がかかっている作業を分解すると、変換そのものより、窓を行き来する時間のほうが長い場合があります。Finderで対象を確認し、ターミナルへ移ってフォルダへ移動し、空打ちの結果を確かめ、実行後にまたFinderへ戻って並びを見る。この往復が3回入るだけで、コマンドの実行にかかる数秒は誤差になります。

さらに、変換の規則をAIに組み立てさせる進め方が増えたことで、行き来する窓が1つ増えました。ファイル名の一覧をコピーしてAIに渡し、返ってきた指定をターミナルへ貼り、結果をFinderで確かめる。工程の中身は変わっていないのに、切り替えの回数だけが増えている状態です。

ここで効くのが、フォルダとターミナルとAIが同じ窓にあるという配置です。一覧とコマンド入力が同じ作業ディレクトリを共有していれば、パスを写す動作と窓を切り替える動作が工程から消えます。この配置で具体的に何ができるのかはできることにまとまっています。2画面型やターミナル常駐型など、別の課題を解いている道具との違いは他のファイル管理との比較で並べて確認できます。費用の目安は料金にあり、対応環境や制限はよくある質問で確かめられます。外出先で結果だけ見たい場合の扱いはiPhone・iPadから続きをにあります。

道具を替えるかどうかを決める前に、自分の一括変更が何回の往復で終わっているかを数えるのが先です。往復が1回で収まっているなら、この記事のzmvと空打ちの2つを覚えるだけで足ります。空打ちのたびに窓を切り替えているなら、直すべきなのはパターンの書き方ではなく、道具の置き場所のほうです。

よくある質問

Macにrenameコマンドが入っていないのはなぜですか?

Linuxでよく使われるrenameはPerl由来のツールで、macOSには標準では同梱されていません。同じ用途はzshに付属するzmvで足ります。autoload -Uz zmv を一度実行すれば使えるようになり、~/.zshrc に書いておけば以降のターミナルでも有効になります。追加インストールは不要です。

一括変更を実行する前に結果を確かめる方法はありますか?

zmvは -n を付けると、変更する予定の対応表だけを表示してファイルには手を付けません。forループを自分で書く場合は mv の手前に echo を置くと同じ確認ができます。表示された内容が意図どおりであることを見てから、-necho を外して実行してください。

一括変更でファイルが消えてしまうのはどんなときですか?

変換の結果、複数のファイルが同じ名前になったときです。macOSのmvは既定で確認なしに上書きし、上書きされたファイルはゴミ箱に残りません。mv -n で上書きを止めるか、変換後の名前を sort してから uniq -d に通し、重複が出ないことを確かめてから実行すると防げます。

日本語のファイル名で置換が当たらないのはなぜですか?

濁点や半濁点が、本体の文字と分かれた形で記録されている場合があるためです。画面では1文字に見えても内部では2文字として並ぶため、手で打った文字列と一致しません。ファイル名から直接コピーして貼り付けるか、濁点を含まない部分だけをパターンに使うと回避できます。

記事一覧へ戻る