- 「mv」コマンドは、ファイルを移動および名前変更するための多用途ツールですが、ファイルの名前変更用に特別に設計されているわけではありません。
- 複数のファイルを名前変更する場合、「mv」を使用すると複雑になり、Bashのテクニックが必要になります。
- 「mv」の代替として、「rename」コマンドがあり、ファイルの名前変更タスクに対してより柔軟性とパワーを提供します。
Linuxの世界でファイルの名前変更の強力さを十分に理解し、mv
と自分自身を休ませましょう。Rename
は柔軟で高速、そして時にはさらに簡単です。この強力なコマンドの使用方法を以下に示します。
mvに何が問題あるのか?
mv
には何の問題もありません。このコマンドは優れた仕事をこなし、すべてのLinuxディストリビューション、macOS、およびその他のUnix系オペレーティングシステムにあります。そのため、常に使用できます。しかし、時にはシャベルではなくブルドーザーが必要な場合があります。
mv
コマンドには目的があり、それはファイルを移動することです。既存のファイルを新しいファイルに新しい名前で移動できるという嬉しい副作用があります。最終的にはファイルの名前が変更されるので、目的は達成されます。しかし、mv
は専用のファイルの名前変更ツールではありません。
Linuxでmvを使って単一のファイルの名前を変更する
mv
を使ってファイルの名前を変更するには、mv
、スペース、ファイルの名前、スペース、ファイルに付けたい新しい名前を入力します。その後、Enterキーを押します。
ls
を使用して、ファイルの名前が変更されたことを確認できます。
mv oldfile.txt newfile.txt
ls *.txt
mvを使って複数のファイルの名前を変更する
複数のファイルの名前を変更したい場合、事態はさらに複雑になります。mv
には、複数のファイルの名前を変更する機能がありません。巧妙なBashのテクニックを使用する必要があります。中程度のレベルのコマンドラインの知識があれば問題ありませんが、mv
を使って複数のファイルの名前を変更する複雑さは、mv
を使って単一のファイルの名前を変更する容易さと大きく異なります。
事態はすぐにエスカレートします。
さまざまなタイプのファイルを含むディレクトリがあるとします。これらのファイルには「.prog」という拡張子が付いています。コマンドラインでこれらのファイルの名前を変更して「.prg」という拡張子を持つようにしたいと考えています。
mv
にこれをしてもらうにはどうすればよいでしょうか? ファイルを見てみましょう。
ls *.prog -l
Bashスクリプトファイルの実際の記述に頼らない方法の1つを以下に示します。
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
うまくいきましたか? ファイルを確認して確認してみましょう。
ls *.pr*
はい、うまくいきました。すべて「.prg」ファイルになり、ディレクトリには「.prog」ファイルがありません。
何が起こったのか?
その長いコマンドは実際に何をしたのでしょうか? 分解してみましょう。
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
最初の部分は、ディレクトリ内の各「.prog」ファイルを順番に処理するループを開始します。
次の部分は、処理内容を示しています。mv
を使用して、各ファイルを新しいファイルに移動します。新しいファイルには、元のファイルの名前から「.prog」の部分を除いた名前が付けられます。代わりに「.prg」という新しい拡張子が使用されます。
最後の部分は、各ファイルの処理が完了したらループを終了します。
Linuxでファイルを名前変更するためにrenameを使用する
もちろん。rename
コマンドです。
rename
は標準のLinuxディストリビューションには含まれていないため、インストールする必要があります。また、Linuxのさまざまなファミリーでは名前が異なりますが、すべて同じように機能します。使用しているLinuxのフレーバーに応じて、適切なコマンド名を代用する必要があります。
UbuntuおよびDebianベースのディストリビューションでは、次のようにrename
をインストールします。
sudo apt-get install rename
FedoraおよびRedHatベースのディストリビューションでは、次のようにprename
をインストールします。Perlを表す最初の「p」に注意してください。
sudo dnf install prename
Manjaro Linuxにインストールするには、次のコマンドを使用します。名前変更コマンドはperl-rename
と呼ばれることに注意してください。
sudo pacman -Syu perl-rename
もう一度やってみましょう
今回はrename
を使用します。時間を戻して「.prog」ファイルのセットを作成します。
ls *.prog
次に、次のコマンドを使用して名前を変更します。その後、ls
を使用して機能しているかどうかを確認します。UbuntuまたはDebianベースのLinuxを使用していない場合は、rename
をLinuxの適切なコマンド名に置き換えてください。
rename 's/.prog/.prg/' *.prog
ls *.pr*
機能し、すべて「.prg」ファイルになり、ディレクトリには「.prog」ファイルがなくなりました。
今回は何が起こったのでしょうか?
その魔法を3つの部分に分けて説明します。
最初の部分はコマンド名、rename
(または他のディストリビューションの場合はprename
またはperl-rename
)です。
最後の部分は*.prog
で、rename
に対して「.prog」ファイルすべてを操作するように指示しています。
真ん中の部分は、各ファイル名に対して実行したい作業を定義しています。s
は置換を意味します。最初の用語(.prog
)は、rename
が各ファイル名で検索するものであり、2番目の用語(.prg
)は、それに置き換えるものです。
コマンドの中央部分、つまり中心式はPerlの「正規表現」であり、rename
コマンドに柔軟性を与えます。
ファイル名の他の部分を変更する
これまでのところファイル名の拡張子を変更しましたが、ファイル名の他の部分も修正しましょう。
ディレクトリには、多くのCソースコードファイルがあります。すべてのファイル名は「slang_」でプレフィックスされています。これはls
で確認できます。
ls sl*.c
「slang_」のすべての出現箇所を「sl_」に置き換えます。コマンドの形式はすでに馴染みのあるものです。検索用語、置換用語、ファイルの種類を変更するだけです。
rename 's/slang_/sl_/' *.c
今回は「.c」ファイルを探し、「slang_」を検索します。「slang_」がファイル名で見つかるたびに、「sl_」に置き換えられます。
同じパラメーターで上記のls
コマンドを繰り返すことで、そのコマンドの結果を確認できます。
ls sl*.c
ファイル名の部分を削除する
検索用語を何にも置き換えることで、ファイル名の部分を削除できます。
ls *.c
rename 's/sl_//' *.c
ls *.c
ls
コマンドから「.c」ファイルがすべて「sl_」で先頭に追加されていることがわかります。それをすべて取り除きましょう。
rename
コマンドは、これまでと同じ形式に従います。私たちは「.c」ファイルを探します。検索用語は「sl_」ですが、置換用語はありません。間に何も入っていない2つのバックスラッシュは、何もない、つまり空の文字列を意味します。
rename
は、各「.c」ファイルを順番に処理します。ファイル名で「sl_」を検索します。見つかった場合は、何も置き換えられません。言い換えれば、検索用語は削除されます。
ls
コマンドの2回目の使用により、「sl_」プレフィックスがすべての「.c」ファイルから削除されたことが確認されます。
特定の部分のファイル名への変更を制限する
ls
を使用して、ファイル名に文字列「param」が含まれるファイルを確認しましょう。次に、rename
を使用してその文字列を文字列「parameter」に置き換えます。ls
をもう一度使用して、rename
コマンドがそれらのファイルに与えた影響を確認します。
ls *param*
rename 's/param/parameter/' *.c
ls *param*
ファイル名に「param」が含まれるファイルが4つ見つかりました。param.c、param_one.c、param_two.cはすべて名前の最初に「param」があります。third_param.cは、拡張子の直前に名前の最後に「param」があります。
rename
コマンドはファイル名のあらゆる場所で「param」を検索し、すべての場合でそれを「parameter」に置き換えます。
ls
コマンドの2回目の使用は、それがまさに起こったことを示しています。「param」がファイル名の最初にあっても最後にあっても、「parameter」に置き換えられています。
Perlのメタ文字を使用して、中央式の動作を調整できます。メタ文字とは、位置または文字列のシーケンスを表す記号です。たとえば、^
は「文字列の開始」、$
は「文字列の終了」、.
は任意の1文字(改行文字を除く)を意味します。
文字列の開始メタ文字(^
)を使用して、検索をファイル名の先頭に制限します。
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c
以前に名前を変更したファイルがリストされており、文字列「parameter」が3つのファイル名の先頭にあることと、1つのファイル名の最後に存在することがわかります。
rename
コマンドは、検索用語「parameter」の前に行の開始(^
)メタ文字を使用します。これにより、rename
は検索用語がファイル名の先頭に存在する場合にのみ検索用語が見つかったとみなすように指示されます。検索文字列「parameter」は、ファイル名の他の場所に存在する場合、無視されます。
ls
で確認すると、ファイル名の最後に「parameter」があったファイル名が変更されていないことがわかりますが、名前の最初に「parameter」があった3つのファイル名では、検索文字列が代替用語「value」に置き換えられています。
rename
の力は、Perlの力にあります。Perlのすべての力が利用できます。
グループ化による検索
rename
には、さらに多くの秘策があります。名前に類似した文字列を持つファイルがある場合を考えてみましょう。それらはまったく同じ文字列ではないため、単純な検索と置換ではここでは機能しません。
この例では、ls
を使用して「str」で始まるファイルを確認します。2つあり、string.cとstrangle.cです。グループ化と呼ばれる手法を使用して、両方の文字列を同時に名前変更できます。
このrename
コマンドの中央式は、ファイル名内で文字列「stri」または「stra」が連続して「ng」が続く文字列を検索します。言い換えれば、検索用語は「string」と「strang」を探します。置換用語は「bang」です。
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c
ls
を2回目使用すると、string.cがbang.cになり、strangle.cがbangle.cになったことが確認されます。
a-z
という用語は、aからzまでのシーケンス内のすべての小文字を意味するPerlの式です。同様に、A-Z
という用語は、AからZまでのシーケンス内のすべての大文字を表します。
このコマンドの中央式は、「aからzまでの小文字のいずれかがファイル名で見つかった場合、それらをAからZまでの大文字のシーケンスの対応する文字に置き換える」と言い換えることができます。
すべての「.prg」ファイルのファイル名を強制的に大文字にするには、次のコマンドを使用します。
rename 'y/a-z/A-Z/' *.prg
ls *.PRG
ls
コマンドは、すべての「.prg」ファイル名がすべて大文字になっていることを示しています。実際には、厳密に言えば、それらは「.prg」ファイルではなくなりました。それらは「.PRG」ファイルです。Linuxは大文字と小文字を区別します。
中央式でa-z
とA-Z
の用語の位置を逆にすることで、その最後のコマンドを逆にすることができます。
rename 'y/A-Z/a-z/' *.PRG
ls *.prg
5分でPerlは学べない
Perlを理解することは、時間をかけても無駄にはなりません。しかし、rename
コマンドの時間を節約する機能を使い始めるには、多くの利点をパワー、シンプルさ、時間で得るために、Perlの知識をあまり必要としません。
コメントする