3:40 起床。まっくら。4:45 頃デスク着。次第に晴れて暑くなってきた。事業の会議とラボの会議。
いろいろと夏のお疲れがたまったのでホンジツは超テンション低めで参りますよ
— 中村保一 博士(猫) (@yaskaz) September 2, 2014
昼休みのお題にやってみました。昨日の質問にあった、連番を含むファイル名がいくつもあって、番号部分に全部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 というコマンドを使っていて、ファイル名パターン決め打ちですが、全体がスッキリしてますね。
#!/bin/sh for i in `ls s_*.c` do n=`echo $i | sed "s#s_(0|[1-9][0-9]*).c#1#g"` fn=s_`expr $n + 20`.c mv $i $fn done #AJACS
— Noriyuki (@ronsum) September 2, 2014
またきたよ(子猫注意) pic.twitter.com/DomphNcqum
— 中村保一 博士(猫) (@yaskaz) September 2, 2014
7 pm 撤収。
部屋に戻りキャリーから出したら部屋を探検するかと思いきや足に乗られてしまいメシも食えなきゃ酒も飲めない訳ですよこれが pic.twitter.com/31IXyJhfio
— 中村保一 博士(猫) (@yaskaz) September 2, 2014