\r\n\r\n
Linuxの世界のファイル名変更エンジンを手に入れ、mvと自分自身を休ませてあげましょう。リネームは柔軟で、速く、時にはもっと簡単にできます。ここでは、この強力なコマンドのチュートリアルを紹介します。
mvは何も問題ない。このコマンドは良い仕事をし、すべてのLinuxディストリビューション、macOS、その他のUnix系OSで見つけることができます。だから、いつでも使えるのです。しかし、時にはシャベルではなく、ブルドーザーが必要な時もあります。
mvコマンドには、ファイルを移動させるという目的があります。嬉しい副次的効果として、既存のファイルを新しい名前で新しいファイルに移動させることができるのです。最終的にはファイル名を変更し、目的のものを得ることができます。しかし、mvはファイル名変更専用のツールではありません。
mvを使ってファイル名を変更するには、「mv」、スペース、ファイル名、スペース、新しいファイル名を入力し、Enterキーを押してください。
ファイル名が変更されているかどうかは、lsで確認することができます。
mv oldfile.txt newfile.txt ls *.txt複数のファイル名を変更する場合は、さらに厄介なことになります。素敵なギミックを使ってね。中級のコマンドラインfuを知っていれば問題ないのですが、mvで複数のファイル名を変更することの複雑さと、mvで1つのファイル名を変更することの単純さは、対照的です。
事態はどんどんエスカレートしていった。
あるディレクトリに様々な種類のファイルが入っているとします。これらのファイルの中には、拡張子が".prog "のものがあります。コマンドラインで名前を変更し、拡張子が".prg "になるようにしたい。
どうやってmvを説得するのか?アーカイブを見てみよう。
ls *.prog -lここでは、実際のBashスクリプトファイルを記述する必要のない方法を紹介します。
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"アーカイブスで確認してみよう。
ls *.pr*現在ではすべて".prg "ファイルであり、ディレクトリ内に".prog "ファイルはありません。
あの長い注文は、実際にはどうだったのでしょうか?
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"最初の部分は、ディレクトリ内の各「.prog」ファイルを順番に処理するループを開始します。
次に、処理がどのように行われるかを説明します。各ファイルを新しいファイルに移動するためにmvを使用します。新しいファイルの名前は元のファイル名と同じになり、".prog "の部分は含まれません。拡張子は新たに".prg "が使用されます。
これがリネームコマンドであることは間違いない。
renameは標準のLinuxディストリビューションには含まれていないため、インストールする必要があります。また、Linuxファミリーによって名前が違いますが、すべて同じように動作します。使用するLinuxのスタイルに合わせて、適切なコマンド名に置き換えるだけです。
UbuntuやDebian由来のディストリビューションでは、このようにリネームをインストールすることができます。
sudo apt-get install renameFedoraやRedHat由来のディストリビューションでは、このようにprenameをインストールすることができます - 最初の「p」に注意してください、これはPerlの略です。
sudo dnf install prenameManjaroLinuxにインストールするには、以下のコマンドを使用します。なお、renameコマンドは、perl renameと呼ばれます。
sudo pacman -Syu perl-rename今回はリネームを使います。時計を戻して、「.prog」ファイルのセットを用意します。
ls *.progでは、次のコマンドで名前を変えてみましょう。その後、lsで動作を確認します。UbuntuまたはDebian由来のLinuxを使用していない場合、renameを適切なコマンド名に置き換えることを忘れないでください。
rename 's/.prog/.prg/' *.prog ls *.pr*その結果、すべて「.prg」ファイルになり、ディレクトリ内に「.prog」ファイルはなくなりました。
これを3つに分けて説明しましょう。
最初の部分は、コマンド名rename(他のディストリビューションでは、prenameまたはperl rename)です。
最後の*.progは、renameがすべての.progファイルに対して操作することを指示します。
中央のセクションは、それぞれのファイル名に対して何をしたいかを定義する。sは置換を意味する。最初の項(.prog)は、リネームが各ファイル名の中で検索するもので、2番目の項(.prg)が代用されることになります。
コマンドの中間部分である中央の式は、Perlの「正規表現」で、renameコマンドに柔軟性を持たせている。
ここまでで、ファイルの拡張子を変更しましたので、残りのファイル名を変更してみましょう。
ディレクトリの中にはたくさんのCのソースファイルがあり、すべて「slang」という接頭辞がついているので、lsで確認することができます。
ls sl*.cスラング "の出現はすべて "sl "に置き換えます。コマンドの書式については、すでにお馴染みです。検索語、置換語、ファイル形式を変えているだけです。
rename 's/slang_/sl_' *.c今回は「.c」というファイルを探し、「slang」を検索しています。ファイル名の中に "slang\"がある場合、"slang "に置換されます。
上記のlsコマンドを同じパラメータで繰り返し実行することで、その結果を確認することができます。
ls sl*.c検索語を何もない状態に置き換えることで、ファイル名の一部を削除することができます。
ls *.c rename 's/sl_//' *.c ls *.clsコマンドから、.cファイルの先頭に "sl "がついていることがわかります。すべて削除してしまいましょう。
リネームコマンドの書式は、前回と同じです。.c "ファイルを探しています。検索語は「sl counter」だが、置換語はない。2つのバックスラッシュの間には何もなく、空の文字列を意味する。
rename は、各 ".c" ファイルを順番に処理します。ファイル名の中に "sl "が含まれていると検索されます。見つけてしまったら、もう何も残らない。つまり、検索語が削除される。
2回目のlsコマンドで、各「.c」ファイルから「slè」接頭辞が削除されていることが確認できます。
lsを使って、ファイル名に「param」という文字列が含まれるファイルを探してみましょう。次に、renameを使って、その文字列を「parameter」という文字列に置き換えます。これらのファイルに対するrenameコマンドの効果を見るために、再びlsを使用します。
ls *param* rename 's/param/parameter' *.c ls *param*param.c、param_one.c、param_two.cはすべて名前の最初に "param "が付いています。"param "を含むファイルを4つ探してください。3つ目のparam.cは、名前の最後、拡張子の直前に "param "が付いている。
リネームコマンドは、ファイル名の任意の場所にある "param "を検索し、すべての場合において "parameter "に置き換えます。
2回目のlsコマンドの使用で、まさにこのようなことが起こっていることがわかります。"param "がファイル名の最初でも最後でも、"parameter "に置き換えられました。
Perlのメタキャラクタを使えば、中間式の挙動を洗練させることができる。メタキャラクタは、文字の位置や順序を示す記号である。例えば、^は「文字列の先頭」、$は「文字列の末尾」、そして、.は任意の1文字を示す(改行は除く)。
ここでは、文字列のメタキャラクタ(^)を使って、ファイル名の先頭に検索対象を限定することにします。
ls *param*.c rename 's/^parameter/value/' *.c ls *param*.c ls value*.c先ほどファイル名を変更したファイルが一覧表示され、3つのファイル名の先頭に「parameter」という文字列があり、そのうちの1つのファイル名の末尾に「parameter」があることが確認できます。
リネームコマンドでは、検索語「パラメータ」の前に行頭(^)のメタ文字を使用します。これは、検索語がファイル名の先頭にある場合、そのファイル名だけを検索対象として考慮するようにリネームに指示します。検索文字列 "parameter" がファイル名の他の場所にある場合、それは無視されます。
lsで確認すると、末尾に「parameter」を持つファイル名は変更されていませんが、ファイル名の先頭に「parameter」を持つ3つのファイル名の検索文字列は、以下のように変更されていることがわかります。"value "は次のように置き換えられます。
リネームの力はPerlの力にある。Perlのすべての機能を自由に使うことができる。
名前を変える秘密はまだまだある。ファイル名に似たような文字列を持つファイルが存在する場合を考えてみましょう。全く同じ文字列ではないので、単純な検索と置換ではうまくいきません。
この例では、"str "で始まるファイルをlsで調べています。string.cとstrangle.cの2つがあり、グループ化という手法で両方の文字列を同時に改名することができる。
このリネームコマンドの中心式は、ファイル名の中に「stri」または「stra」という文字列があり、これらの文字列の直後に「ng」が続くものを検索する。".つまり、私たちの検索キーワードは、「string」と「strang」を探すことになります。代替語は「バン」。
ls str*.c rename 's/(stri|stra)ng/bang/' *.c ls ban*.cもう一度lsを使うと、string.cがbang.cに、string.cがbangle.cになったことが確認できる。
renameコマンドは、translati***という名前のファイル名に対して操作を行います。翻訳の簡単な例は、一連のファイル名を強制的に大文字に変換することである。
なお、以下のrenameコマンドでは、中心式の開始をs/とする代わりに、y/としています。つまり、「置き換え」ではなく「翻訳」を行っているのです。
a-z は,a から z までの小文字の並びを表す Perl の式です。同様に、a-zはaからzまでのすべての大文字を表します。
このコマンドの中心式は、"ファイル名の中にaからzまでの小文字があれば、それに対応するaからzまでの大文字の並びの文字に置き換える "と解釈することができる。
すべての「.prg」ファイルのファイル名を強制的に大文字にするには、次のコマンドを使用します。
y/a-z/a-z/"*.prgにリネームしてください。
ls *.PRGlsコマンドは、すべての".prg "ファイル名が大文字になったことを教えてくれます。実は、厳密には、もはや「.prg」ファイルではないのです。これらは「.PRG」ファイルです。
中心式のa-z項とa-z項の位置を逆にすることで、最後のコマンドを反転させることができる。
y/A-Z/A-Z/"*.PRGにリネームします。
ls *.prgPerlをマスターするのは、とても良い方法だと思います。しかし、renameコマンドの時間短縮機能を利用するためには、Perlの知識が全くなくても、機能面、シンプルさ、時間面で大きなメリットを享受することができるのです。