3:40 起床。まっくら。4:45 頃デスク着。次第に晴れて暑くなってきた。事業の会議とラボの会議。
昼休みのお題にやってみました。昨日の質問にあった、連番を含むファイル名がいくつもあって、番号部分に全部20とか足してリネームしたい。は bash だけ(と mv)で無理やりやると、以下のようになります(zsh だとマッチした文字列がどう格納されてるか知らんのでだれかなんとかしてください)
ディレクトリに hoge1.fa hoge2.fa hoge3.fa があったとして、以下のシェルスクリプトで hoge21.fa hoge22.fa hoge23.fa になるはずです。
for i in *; do if [[ "$i" =~ ^([^0-9]*)([0-9]+)([^0-9]*)$ ]] ; then l=${BASH_REMATCH[1]}; n=`expr "${BASH_REMATCH[2]}" + 20`; r=${BASH_REMATCH[3]}; mv $i $l$n$r; fi; done;
【追記】構造がわかりにくいから、ここはワンライナーじゃなくてファイルに書くべきですわな。
#!/bin/bash
for i in *; do
if [[ "$i" =~ ^([^0-9]*)([0-9]+)([^0-9]*)$ ]] ; then
l=${BASH_REMATCH[1]} # 先頭の数字でない部分 ^([^0-9]*)
n=`expr "${BASH_REMATCH[2]}" + 20` # 数字の部分 ([0-9]+) に 20 足す
r=${BASH_REMATCH[3]} # 末尾の数字でない部分 ([^0-9]*)$
mv $i $l$n$r
fi
done
yn@ynAir:~/test $ ls
hoge1.fa hoge2.fa hoge3.fa plus20.sh*
yn@ynAir:~/test $ ./plus20.sh
yn@ynAir:~/test $ ls
hoge21.fa hoge22.fa hoge23.fa plus40.sh*
で、上記のスクリプトに plus20.sh という名前をつけてその場で実行したら、このスクリプトの名前も plus40.sh になってしまって吹いた。そりゃそうだw
【追記】先につくっていた方がいました。この方の方法は、sed というコマンドを使っていて、ファイル名パターン決め打ちですが、全体がスッキリしてますね。
7 pm 撤収。