回答:
renameコマンドを発見するまで、私はこれを行うためにperlスクリプトを作成していました。
名前の変更を行うためにperl正規表現を受け入れます。
このため、2つのコマンドを入力しました。
rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log
ただし、一部のディストリビューションでは、rename
この機能がなく(そのmanページを参照)、perl-rename
またはをインストールする必要がありprename
ます。
mmv
が、結局のところrename
、正規表現の力を使用できるおかげで
perl-rename
。
mmvは、複数のファイルを移動/名前変更する標準のLinuxユーティリティです。ほとんどのディストリビューションのリポジトリから入手できます。上記の例では、次のようにすることができます。
mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log
詳細については、このdebadayの記事またはマニュアルページを参照してください。
rename
utilはあまり「標準」ではありません。各ディストリビューションには異なるrename
ツールが付属しています。たとえば、ここのGentooではrename
、sys-apps/util-linux
パッケージからのものであり、正規表現をサポートしていません。
Hamish Downerさんが提案しmmv
ました。特にスクリプト内で使用するのに便利なようです。
一方、一般的なケースでは、renameutilsが必要になる場合があります。これにはコマンドqmv
とqcp
コマンドがあり、選択したテキストエディター(私の好み:Vim)が開き、そこで宛先ファイル名を編集できます。エディターを保存して閉じた後、qmv
/ qcp
はすべての名前変更を行います。
mmv
とqmv
はどちらも、ファイルの名前を正しい順序で変更し、循環的な名前変更を検出するのに十分なほどスマートで、必要に応じて一時ファイルを自動的に作成します。
sys-apps/rename
では、パッケージをemergeすることもできます。これにより、renamexm
正規表現の名前変更だけでなく、大文字と小文字の大文字やその他の素晴らしいこともできます。
公平であるために:
rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt
この出力を与えます:
Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.
だが:
rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log
正しい出力を与えます:
System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log
{-n}スイッチを{-v}に置き換える
これを行うための小さなbashスクリプトを作成しました。
#!/bin/bash
for f in `ls /path/to/folder`; do
# Create new filename from the old one
# This example replaces A (upper case) with a (lower case)
new_file=`echo "$new_file" | tr A a`
# Rename the file
mv "$f" "$new_file"
done