Linux renameコマンドの一括名前変更方法
Linuxのrenameコマンドには2つのバージョンがあります。1つはC言語バージョンで、1つはPerl言語バージョンで、初期のLinuxリリース版は基本的にC言語バージョンを使用していましたが、今ではC言語バージョンを見るのは難しいです。歴史的な理由で、Perl言語が赤くなったとき、Linuxのツール開発者たちはPerlがCに取って代わることができると信じていました。そのため、ほとんどのツールはもともとCバージョンだったがPerlに書き換えられた。Perlバージョンのサポートは正規処理であるため、機能がより強く、C言語バージョンはもう必要ない。
システム内のrenameコマンドがどのバージョンであるかをどのように区別しますか?
man renameを入力して最初の行が表示されます。
RENAME(1) Linux Programmer’s Manual RENAME(1)
では、これがC言語バージョンです。
次のように表示されます。
RENAME(1) Perl Programmers Reference Guide RENAME(1)
これがPerlバージョンです!
2つのバージョンの構文の違い:
C言語の、manの上の注釈に従って、
renameの構文フォーマットは次のとおりです。
rename fromtofile
このコマンドには3つのパラメータがあります。from:名前を変更します。to:名前を変更します。fileで変更する必要があるファイルはどれですか。
使用例:
例えば、logで始まるファイルがあります。log 001.txt, log002.txt ……. log 100までtxt
今、このファイルのロゴをすべてhistoryに置き換えたいです。
rename log history log*このコマンドの意味はよくわかりました。logで始まるすべてのファイルのlog文字をhistoryに置き換えます。
このように置換ファイルはhistory 001である.txt, history002.txt ….. history 100までtxt
rename C言語バージョンのもう一つのman例は、接尾辞名を一括変更することです。
たとえば、jpegのすべての接尾辞画像ファイルをjpgファイルに変更します。
rename .jpeg.jpg*.jpegこのようにして、すべて.jpeg拡張の接尾辞名はすべて.jpg
ここで、rename C言語バージョンで実現できる機能をまとめます。ファイル名を一括変更すると、各ファイルが同じ文字列で置き換えられます。つまり、ループなどを実装して番号で名前を変更することはできません!
Perlバージョンのバッチ名の変更は、Perlのメリットとして、正規表現を使用して奇抜な機能を完成させることができます。
perlバージョンのパラメータフォーマット:
rename perlexprfiles
perlバージョンのrenameには2つのパラメータしかありません。最初のパラメータはperl正規表現で、2番目のパラメータは処理するファイルです。
man renameのヘルプ例:1)ファイルがあります。bakは終わり、今これらを考えています。bakは全部取り除く。
rename 's/\.bak$//' *.bak
このコマンドは簡単です。私はまだperlを勉強したことがありません。perlに文字列を置き換えるのがそうなのか分かりませんが、sedはそうしています。だから、sedやtrの基礎があれば、分かりやすいです。この置き換えはsedの正則文法とそっくりです。
2)すべてのファイル名に大文字が含まれているものを小文字に変更します。
rename 'y/A-Z/a-z/' *
依然としてsedの置換文法と同じで、多く解釈する必要はなくて、もし読めないならば、系統的にsedを学ぶことができます。
いくつかの実用的な例があります。
ファイル名のスペースを一括削除コードのコピー
find . -type f -name "* *" -print |
while read name; do
na=$(echo $name | tr ' ' '_')mv "$name" $na
fi
done
このバージョンは以前私がずっと使っていたので、どのネット上で検索したのか分かりませんが、tr/sed/awkコマンドを系統的に勉強したことはありません。
注釈して、よく理解して、find.type f-name"**"-printという文は、現在のディレクトリの下にあるすべてのタイプの普通のファイルを検索し、名前の中にスペースが含まれているファイルを印刷します。findのデフォルトは印刷されたこの-printが余分になって、パイプを通じてwhileに転送され、ファイル名はname変数に配置され、trコマンドでスペースを下線に置き換えます。次に、実行後の名前が異なる場合はmvコマンドを使用して名前を変更すると判断します。しかし、findがすべてのファイル名にスペースが含まれていることをクエリーしたため、このifは有無を判断します。trコマンドを使用すると、$na変数は$name変数に等しくないに違いありません。
このコードは簡略化できます
コードのコピー
find . -type f -name "* *" |
while read name; do
na=$(echo $name | tr ' ' '_')
mv "$name" "$na"
done
trはsedの簡略バージョンであるように見え、trはスペースを下線で置き換えます。
もう1つはsedバージョンの実装です。
for f in *;do mv "$f" `echo "$f" | sed 's/[ ]\+/_/g' `; done
ここでsed式は、次のように書くこともできます。
sed 's/[[:space:]]\+/_/g'
しかし、sedに1回または複数回現れるプラス記号は、反スラッシュを追加する必要があることを覚えておいてください。すなわち+まあ、この2つの方法はあまりにもうるさいので、renameの実現を見てみましょう。
rename 's/[ ]+/_/g' *
OKは簡単です。