Linuxで大量のファイルを一つずつ名前変更するのは、面倒な作業です。画像、ドキュメント、音声ファイル、ソフトウェアのログなどを整理する場合、一括で名前を変更すれば時間を節約でき、ミスも減ります。幸いなことに、Linuxにはこのプロセスを迅速かつ簡単にするコマンドやツールが数多く用意されています。このガイドでは、コマンドラインからでも、より専門的なツールからでも、複数のファイルの名前を一括で変更するための最も一般的な方法を学びます。

Linux初心者にとって最も一般的なタスクの一つは、ファイルの一括リネームです。Linuxインターフェースに慣れていないと、これは手動で時間のかかる作業のように思えるかもしれません。しかし、このプロセスを高速化する方法はたくさんあります。必要なのは、どれが最も効果的かを知ることです。
ファイル転送タスクの例
それぞれの方法を説明するために、一般的な名前変更タスクを表す2つの例を挙げます。ファイル名の変更方法は、現在のファイル名や実際の機能によって様々です。ここで挙げる2つの例は、各ツールの一般的な使用方法を理解するのに役立ちます。ただし、特定のニーズに最適な使い方を理解するには、選択したツールについてより深く調べる必要があります。
ファイルの一括名前変更で最も難しいのは、実際に何をしたいのかを決めることかもしれません。各ファイル名のどの部分を削除し、どの部分を残し、どの部分を別の名前に翻訳したいのかを考えてみましょう。
最初のタスクは、現在のフォルダ内にある一致するすべてのファイルの拡張子を変更することです。例えば、「.txt」拡張子を「.md」に変更すると、test-001.txtファイルはtest-001.mdに、ANOTHER.txtファイルはANOTHER.mdに名前が変更されます。これは、「.txt」で終わるファイルにのみ適用されます。
1234つ目のタスクは少し複雑で、これらのツールの高度な機能をいくつか紹介します。ファイル名の特定の部分を削除し、他の部分はそのままにする必要があります。これはすべてのファイルに再帰的に適用されます。具体的には、DDDD_something.extという拡張子を持つすべてのファイルを検索し、DDDD.extに名前を変更します。つまり、1234_this-is-my-doc.docを9999.docに、docs/9999_about.txtをdocs/XNUMX.txtに変更します。
1. forループ、組み合わせ、パラメータ置換の使用
この最初のアプローチは、他の多くのシェルにも採用されているbashシェルのいくつかの機能を利用しています。まず、候補となるファイルのセットを反復処理するために、単純なforループを使用します。次に、これらのファイルは、ファイル名のマッチングに改良されたパターンであるglobを使用して識別されます。最後に、このアプローチでは、パラメータ置換と呼ばれる、特定のパターンに基づいて文字列を変更できる構文を使用します。
最初のタスクでは、次の API コードを使用して .txt 拡張子を .md に変更できます。
for file in ./*.txt;
do
mv -- "$file" "${file%.txt}.md";
done
forループは、glob ./*.txtに一致するすべてのファイルを反復処理します。これは、現在のディレクトリ内にある「.txt」拡張子で終わるすべてのファイルに一致します。
for ループ内のコマンドは、ファイルを % 演算子を使って生成された新しい名前に移動します。この記号は、文字列の末尾に一致するパターンの最短部分を削除します。この場合、各ファイル名の末尾から「.txt」を削除し、「.md」を追加します。
警告
この記事のすべての例は説明目的であり、本番環境で表面的に使用すべきではありません。効果的な解決策として、ファイルに特殊文字(特にスペース)が含まれているかどうかを確認し、障害発生時に備えたフォールバックポリシーを常に用意しておく必要があります。
2 番目のタスクは、繰り返しとより広範囲のファイルを処理するための、より複雑な glob パターンから始まります。
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_?*.*;
do
mv -- "$file" "${file//_*./.}";
done
./**/ は、現在のディレクトリとその下の階層にあるすべてのディレクトリに一致します。[[:digit:]] パターンは1桁の数字に一致するため、連続する4桁の数字の後にアンダースコアが続くと、要求されたファイルに一致します。
このコマンドを実行するために使用しているコマンド インターフェイスと、それがサポートするレプリケーション機能について理解していることを確認してください。
助言
Bash 4以降でレプリケーションを有効にするには、shopt -s globstarをXNUMX回限りのコマンドとして、またはスクリプト内で実行してください。Macでは、zshコマンドインターフェースはデフォルトでレプリケーションをサポートしています。
2. forループとsedループの使用
forループ内のコマンドのもう一つの選択肢は、ストリームエディタであるsedです。sedプログラムは、macOSを含むあらゆるLinuxシステムで利用できるはずです。
for file in ./*.txt;
do
mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";
done
このバージョンの違いは、パラメータがコマンド置換によって置き換えられ、sed関数が呼び出されることです。$(…) 構文はコマンドを実行し、この時点で出力を置き換えます。
sed に渡される正規表現は、各ファイル名の末尾の値「txt」を「md」に置き換えます。パターン内の $ 文字により、ファイル名の末尾で一致が確実に発生します。
2 番目のタスクでは、基本的なアプローチは同じですが、正規表現はより複雑になります。
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_*.*;
do
mv -- "$file" "$(echo "$file" | sed -E -e 's/([[:digit:]]{4})_.+(\..+)/\1\2/')";
done
sed の正規表現構文は {4} のような繰り返し演算子をサポートしており、glob パターンの冗長なアプローチを回避できることに注意してください。
これらのsedソリューションは、オペランドベースのものよりも若干長くなりますが、特に正規表現とsedに精通している人にとっては読みやすくなっています。sedは正規表現のサポートをはじめ、多くの機能を備えているため、より強力な代替手段となっています。そのため、複雑な要件がある場合には、sedが最適な選択肢となります。
3. 名前変更コマンドを使用する
renameコマンドは、任意のPerlコードの実行をサポートし、ファイル名の変更処理に最適化されているPerlスクリプトです。非常に強力なコマンドですが、Perlがインストールされているシステムにインストールする必要があります。
インストールが完了すると、最初の例のように拡張機能の名前を変更するなど、単純なタスクでは rename の使用が非常に簡単になります。
rename 's/\txt$/md/' ./*.txt
正規表現がsedの例の正規表現と完全に一致していることに注目してください。ただし、ここでの利点は、renameがファイル名の入力を処理することです。プログラムはすべてのファイル名引数に置換を適用するため、すべての.txtファイルに拡張されたglobを使用することで、タスクを1行で完了できます。
助言
renameコマンドは-n/–dry-runオプションをサポートしています。このオプションを使用すると、ファイル名を実際に変更することなく、潜在的な変更内容のログを出力します。これは優れた安全機能なので、可能な限り使用することをお勧めします。
正規表現が少し複雑であっても、2 番目のタスクに必要なのは 1 行のコマンドだけです。
rename 's/(\/\d{4})_.*(\..*)/$1$2/' ./**/*
繰り返しになりますが、これはブログの再帰フォルダーの拡張サポートを活用していることに注意してください。
4. zshでzmvを使用する
Zシェルであるzshをお使いの場合は、事前に有効化しておくことで、別のオプションを利用できます。zmvは、名前変更の簡易版として機能するシェル関数です。このコマンドを使用して、ケースバイケースで、または.zshrcなどの起動スクリプト経由でロードする必要があります。
autoload zmv
有効にすると、次のように zmv を呼び出して最初のタスクを実行できます。
zmv -W '*.txt' '*.md'
名前変更とは異なり、zmv は正規表現ではなくグロブを使用するため、効率は低くなります。しかし、この例からもわかるように、使い方は簡単です。-W オプションを使用すると、構文がデフォルトよりもさらに簡素化されます。
助言
zmv はシェル関数であるため、組み込みのマニュアルページはありません。ただし、man zshcontrib でいくつかの情報を得ることができます。テスト実行用の -n オプションもサポートされている点に注意してください。
zms には zsh が必要なので、サブディレクトリへの複製を含む、シェルによって提供される広範なコンパイル機能を活用します。
zmv '(**/)([0-9][0-9][0-9][0-9])_*(.*)' '$1$2$3'
正規表現がサポートされていないため、このスタイルは少し長くなりますが、それでも読みやすいです。
5. mmvの使用
mmvは「Multiple Move」の略で、ファイルの一括リネームに特化したツールです。インストールが必要になる可能性が高いですが、sudo apt install mmv(Ubuntu)、sudo yum install mmv(RHEL/CentOS/Fedora)、brew install mmv(macOS)、またはお使いのパッケージマネージャーの同等のコマンドを実行するだけで簡単にインストールできます。
インストール後、ツールを使用して拡張機能の名前を簡単に変更できます。
mmv '*.txt' '#1.md'
mmvとの大きな違いは、パターンとマッチの処理方法です。一般的なワイルドカードに加えて、mmvは;ワイルドカードもサポートしています。これを使用すると、任意の数のフォルダにマッチさせることができ、2番目のタスクの再帰的な性質をサポートします。
mmv -n ';[0-9][0-9][0-9][0-9]_*.*' '#1#2#3#4#5.#7'
mmv がマッチ参照をサポートしていることにも注目してください。従来の括弧ではなく、ワイルドカード文字に一意の番号を割り当てることで、マッチ参照がサポートされています。これにより、最終的な置換式では6つの異なるマッチが生成されます。XNUMXつは; に一致するメインパス、もうXNUMXつはXNUMXつの数字それぞれ、#XNUMX はアンダースコアの後の任意の文字(これは無視されます)、そしてもうXNUMXつはピリオドの後の拡張子です。
このアプローチのため、mmv は初期パターンに多数のワイルドカードが含まれるタスクでは非常に扱いにくくなります。しかし、一般的な拡張子の切り替えなどのタスクでは、シンプルさと可読性の点で他に類を見ないほど優れています。
Linuxにはファイル名を一括変更するオプションがいくつかありますが、それぞれに慣れるには少し時間がかかります。自分に最適なオプションを選び、できるだけ使い慣れ、-n/–dry-runオプションをサポートするツールがあれば積極的に活用することをお勧めします。
正規表現のファンなら、その圧倒的なパワーに勝るものはないでしょう。renameのようなツールはきっと役立つでしょう。シェルの達人、つまりワイルドカードのエキスパートなら、zmvやmmvが気に入るかもしれません。ただし、これらのツールはZシェルを使うか、Zシェルをインストールしてその特殊な構文を習得した場合にのみ機能します。
同時に、パラメータ置換は驚くほど強力であり、ファイルを一括でリネームしたい場合もあるため、シェルスクリプトを書くことにはさらなるメリットがあります。最終的には、どれを選ぶかはあなた次第です。これらのオプションはどれも、GUIを使って何百ものファイルを手動でリネームするよりも優れています。これがコマンドラインの威力です。


