1. 概要

一般的なタスクの1つは、ファイルの名前をバッチで変更することです。 ファイルの名前を変更するときは、特定の命名規則に従う必要があることがよくあります。 この場合、(拡張子の前の)名前が数字であるファイルのセットが必要であり、各ファイル名は4桁の数字である必要があります。 数値が小さい場合は、ファイル名に先行ゼロを追加する必要があります。

このチュートリアルでは、bashでこれを実現するいくつかの方法を見ていきます。

2. 設定

例として使用するサンプルファイルをいくつか作成してみましょう。

$ touch 1.txt 02.txt 123.txt 1234.txt
$ ls -1
02.txt
1234.txt
123.txt
1.txt

3. ファイル名と拡張子を抽出する

bashでは、パラメーター展開を使用して、ファイル名とその拡張子を抽出できます。 この手法を使用すると、目的の結果を得ることができます。

$ for file in [0-9]*.txt;
do
name=${file%.*}
extension=${file##*.}
new_name=`printf %04d.%s ${name} ${extension}`
mv -n $file $new_name
done
$ ls -1
0001.txt
0002.txt
0123.txt
1234.txt

上記の例では、printfコマンドで指定された%04d形式を使用しています。 数値に先行ゼロを追加して、4桁の数値にします。

4. renameコマンドの使用

rename は、複数のファイルの名前を変更する簡単なコマンドです。 ただし、特別な点は、引数としてルールを指定できることです。 例を使ってこれを理解しましょう:

$ rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
$ ls -1
0001.txt
0002.txt
0123.txt
1234.txt

上記の例では、 unless ルールは、名前が4桁の数字ではないすべてのテキストファイルを処理することを指定しています。 次のブロックは、ファイル名に先行ゼロを追加し、それに応じてファイルの名前を変更する正規表現を使用します。

5. awkおよびxargsコマンドの使用

awkコマンドとxargsコマンドを組み合わせて使用して、ファイル名に先行ゼロを追加することもできます。

$ ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv -n
$ ls -1
0001.txt
0002.txt
0123.txt
1234.txt

この例では、awkコマンドのprintf関数を使用して、先行ゼロのファイル名を生成しました。 元のファイル名と新しいファイル名を標準の出力ストリームに出力します。 次に、 xargs コマンドは、それらをコマンドライン引数に変換し、mvコマンドに渡します。

6. 結論

この記事では、ファイル名に先行ゼロを追加するための実際的な例のいくつかについて説明しました。 まず、bashシェルのパラメーター展開を使用しました。 次に、renameコマンドを使用した例を見ました。 最後に、awkコマンドとxargsコマンドの組み合わせを使用したソリューションを示しました。