シェルワンライナー160本ノック: 問題3

問題

下記コマンドで100万個ファイルを作る

$ mkdir ./tmp
$ cd ./tmp 
$ seq 1000000 | xargs -P 2 touch

このファイルを先頭に0つけて7桁のファイルにするようにする

答え

$ time ls -U | xargs -P2 rename 's/^/0000000/;s/0*([0-9]{7})/$1/'

解説

まず rename コマンドは正規表現にマッチしたファイルを同じく正規表現で置換した結果にリネームするというやつ。

ls -U はlsをソートせずに表示するやつ。ソートしない分速いらしい。

ここから肝心の正規表現について解説していく。

先頭に0つけて7桁にするには下記ステップを踏めばOK

(1)とりあえず全ファイルの先頭に0000000 をつけちゃう

(2)0*繰り返しのあと数字7桁のみを切り出しちゃう

上記(1)(2)を正規表現で書くと…

#(1)
s/^/0000000/
#(2)
s/0*([0-9]{7}/$1/
#0* : 0の0こ以上の繰り返し
#() : キャプチャグループ。カッコの中の正規表現にマッチするやつを後で$1で参照できるようにする
#[0-9]{7} :任意の数字7桁にマッチ。詳しく下記で
#[0-9]: 範囲指定の正規表現 0-9の任意の数字にマッチ
#{7}: 直前の正規表現の繰り返し回数
#つまりまとめると⇒ 末尾の7桁を残してそれより頭についている0は削除。

感想

chatGPTで質問すれば、わからないところすぐ教えてくれるしすごい。

新しい職場でlinuxごりごり使いそうなので、シェルを使いこなせるといいかなと思ってやり始めたが、「AIに駆逐されるのでこの勉強も不要なのか?」と思いつつ、コツコツやってみる。