スキャナにADF付いてるけど片面スキャンしかできない人にメリットのあるシェルスクリプト

2010年2月8日 Linux, スクリプト関連, 雑記

タイトルの通り。両面スキャンできるリア充爆発しろw
片面スキャンしかできなくてもADFさえあれば半自動くらいにはできるんだぜ!っていう強がりを言ってしまう非リアのためのシェルスクリプトw

最近使ってないから、使い方の記憶がいまいち曖昧なんだけど、たしか、ファイルを表を”page_a-###.jpg”、裏を”page_b-###.jpg”で保存した後、保存先のディレクトリ、画像の縦サイズ、横サイズの3つを引数としてスクリプトを実行。これでページが整列した状態の圧縮ファイルが生成される。と言う流れだったはず。

たぶん、自分の性格上、だらしない運用が出来ることがなんとなく条件になってるんだろうし。
お茶を飲みながらアニメみてたら仕事が終わってた。みたいな感じ。これだとちょっと手を動かさなきゃいけないのがアレだけど。

そうそう、久しぶりに読み返してみて思ったんだけど、ゼロ埋めってホントはもっと良いやり方あるんだよね?きっと。知ってる人いたら教えてください。是非にも。
twitterとかメールとかでも良いです。kotokoiorg(・д・`)ノシgmail.com

前置きはこの辺にしてここからスクリプト。

#!/bin/sh

zero () {
  if [ $1 -lt 10 ]
    then
    val=`expr 00$1` #10未満
  elif [ $1 -lt 100 ]
    then
    val=`expr 0$1` #100未満
  else
    val=`expr $1` #100以上
  fi
}

cd $1
rename ‘s/-/_/’ *

pageA=`ls | grep page_a | wc -l`
pageB=`ls | grep page_b | wc -l`
count=1
pAcount=1

pagenum=`ls | wc -l`

while [ $count -le $pagenum ]
do
  if [ $(( $count & 1 )) -eq 0 ]
  then
    zero $pageB
    ren1=”page_b_$val”
    pageB=`expr $pageB – 1`
  elif [ ${pAcount} -eq ${pageA} ]
  then
    zero $pAcount
    ren1=”page_a_$val”
  else
    zero $pAcount
    ren1=”page_a_$val”
    pAcount=`expr $pAcount + 1`
  fi

  zero $count
  ren2=”page_$val”
  convert -crop $2x$3+0+0 “$1/$ren1.jpg” “$1/$ren2.jpg”
  count=`expr $count + 1`
done

rm page_a*.*
rm page_b*.*

bn=`basename $1`
zip -5 ../$bn.zip *.*

rm *.*
cd ..
rmdir $bn

スクリプトここまで。
最初のzero ()っていうのは説明もクソもなくゼロ埋めの関数ですね。
投げ込まれた数値をゼロで桁合わせしてval変数に格納しています。
もっと良いやり方知ってる人いたら教r・・・教えてください。お願いします。

ではでは、この辺から説明。

cd $1
rename ‘s/-/_/’ *

pageA=`ls | grep page_a | wc -l`
pageB=`ls | grep page_b | wc -l`
count=1
pAcount=1

pagenum=`ls | wc -l`

一、二行目は見た通りそのまんま、第一引数で渡されたディレクトリに移動してファイル名にあるハイフンをアンダースコアに変換。
※この変換はファイル名の書式が気にくわないとか言うことがなければなくても構いません。うちのスキャンソフトではなぜかハイフンが入ってしまって腹立つので入れてあるだけです。

三、四行目はpage_a、page_bそれぞれのファイル数を取得、格納。
五、六行目これは得に説明の必要ないですね。カウンターのプリセット。
七行目でページの総数(ディレクトリ内のファイル総数)を取得、格納。
ここまでで基本的な値の格納は完了。次はコレ

while [ $count -le $pagenum ]
do
  if [ $(( $count & 1 )) -eq 0 ]
  then
    zero $pageB
    ren1=”page_b_$val”
    pageB=`expr $pageB – 1`
  elif [ ${pAcount} -eq ${pageA} ]
  then
    zero $pAcount
    ren1=”page_a_$val”
  else
    zero $pAcount
    ren1=”page_a_$val”
    pAcount=`expr $pAcount + 1`
  fi

  zero $count
  ren2=”page_$val”
  convert -crop $2x$3+0+0 “$1/$ren1.jpg” “$1/$ren2.jpg”
  count=`expr $count + 1`
done

言わずと知れた天下のwhile文。先に設定したcount変数とpagenum変数の値が等しいかpagenum変数の値の方が小さくなるまで処理を繰り返します。
中に入っているif文はcount変数と1が共に0またはNULL以外の場合、count変数と0が同一かを判定します。※count変数と0を直接比較しても問題ないような気もしますが、変更後のテストが面倒なのでそのままになっています。ここは確か1の部分に別な変数が入っていたような記憶があるんですが・・・

この条件が真ならば、次のコードが実行されます。たぶん。この辺うろ覚えで自信ないです。

  zero $pageB
  ren1=”page_b_$val”
  pageB=`expr $pageB – 1`

一行目でzero関数にpageB変数の値を引数として投げてval変数を書き換え。
二行目でren1変数に”page_b_$val”という文字列($valは展開された変数が入る)を格納。
三行目でpageB変数の値を1減らしてpageB変数を上書き。
一つ目の条件が偽の場合は次に出てくるelifの条件でpAcount変数とpageA変数が同一かを判定します。

elifの条件が真ならば、次のコードが実行されます。

  zero $pAcount
  ren1=”page_a_$val”

内容は1つ目の実行内容とほぼ同じです。

elifの条件が偽ならば、次のコードが実行されます。

  zero $pAcount
  ren1=”page_a_$val”
  pAcount=`expr $pAcount + 1`

内容は1つ目の実行内容とほぼ同じです。

if文の処理終了後、次のコードが実行されます。

  zero $count
  ren2=”page_$val”
  convert -crop $2x$3+0+0 “$1/$ren1.jpg” “$1/$ren2.jpg”
  count=`expr $count + 1`

一行目でzero関数にcount変数の値を引数として投げてval変数を書き換え。
二行目でren2変数に”page_$val”という文字列($valは展開された変数が入る)を格納。
三行目でimagemagicのconvertコマンドをcropオプションをつけて呼び出し。$2変数、$3変数にはそれぞれ、縦横の数値が入っているはず。$1変数にはディレクトリが、$ren1変数には変換元のファイル名、$ren2変数には変換先のファイル名いずれも拡張子なしが入っています。
四行目でcount変数の値に1足してcount変数を上書き。

これらの処理がファイル数分完了後、次のコードが実行されて、処理が完了します。

rm page_a*.*
rm page_b*.*

bn=`basename $1`
zip -5 ../$bn.zip *.*

rm *.*
cd ..
rmdir $bn

読んでも何にも得られるものはないのにここまで読んでしまった方。本当にお疲れ様でした。

※例によって例のごとくインデントが全角です。本当にありがとうございました。

コメントは受け付けていません。