2009年6月11日

getopt と getopts の中身

人から添付ファイルを送られてくると、どうも自分の管理方法と異なるスタイルで命名されてしまいます。日本語か英語か、という問題もありますが、日付の問題も重要です。
6月6日に受け取った JPEG のファイル群は、なぜか「ファイル名606.jpg」というスタイルでした。 0606 ではなく、66 でもなく、606 です。個人的には非常に許せないスタイルなので、ちょっと変更しました。
$ for f in $(ls *606.jpg); do mv $f 20090606${f/606}; done
これはこれで目的を達成するには十分なのですが、汎用性に欠けていることは否めません。 そこで、''getopt'' でも使ってスクリプトでも作っておくかな、と思いましたが、''getopt'' を使った方が良いのか ''getopts'' を使った方が良いのかがパッと出てきません。片方は bash 組み込みのコマンドであり、もう片方は C 言語で記述されたバイナリです。 ''man'' を読めばすぐに分かることですが、''man -a'' をエイリアス登録してあるため、次々に出てくるマニュアルが脳裏をよぎります。
そんなこんなで、中身をのぞいてみることにしました。
$ nm -ax /usr/bin/getopt
00001000 03 00 0010 00000004 __mh_execute_header
00000000 01 00 0201 00000018 _exit
00000000 01 00 0201 0000001e _getopt$UNIX2003
00000000 01 00 0200 0000002f _optarg
00000000 01 00 0200 00000037 _optind
00000000 01 00 0201 0000003f _printf
00000000 01 00 0201 00000047 _putchar

$ nm -ax /usr/bin/getopts
nm: file: /usr/bin/getopts is not an object file

$ cat /usr/bin/getopts
#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
# This file is in the public domain.
builtin ${0##*/} ${1+"$@"}
と、まぁ、こんなことをやっていたらそもそもの目的を失ってしまいましたが、とりあえずbash でスクリプトを作るなら ''getopts'' の方が良いのかな、と思いました。使いやすさの問題ではなく、読むべきマニュアルが局所化されそうなので。。。
それにしても似たような画像ファイルが増えてくると何が何やら、という気が強くなってきます。主にオリエンテーリング大会のコースなわけですが。もうちょい効率的に管理しておきたいものです。
コメントを投稿