シェルスクリプトによるファイルの間引き

昨日の続き。


ふと思ったんだけど、id:STARLESS氏の環境には、NASがあったはず。
もし、ファイル自体が玄箱などのLinuxベースNASに収められている場合は telnet でログインしてシェルスクリプトで一括操作できるな。
ということで、そちらの方法も考えてみた。


まずは、自分の環境にある玄箱telnet でログインする。
こういう作業の場合、TeraTermPro (開発者:寺西 高)というフリーソフトが人気あるので、これを使う。
http://hp.vector.co.jp/authors/VA002416/
ただし、開発自体は随分前に止まっている。
ソースがフリー(BSDライセンス)で公開されているので、さらに高機能にされたバージョンが有志により開発され続けている。
興味がでたら、そちらを使ってみてもいいと思う。
…話題が脱線した(^_^;


teraterm をインストールしたくない場合は、Windowsに標準で telnet コマンドが入っているのでコレを使う。
玄箱IPアドレスが 192.168.1.1 の場合、コマンドプロンプトを起動して次のように入力する。


c:\> telnet 192.168.1.1


どちらかといえば、SEも好んで使う TeraTerm がオススメ。


アカウントとパスワードは、玄箱をセットアップする時に作っていると思う…
無い場合は、玄箱IPアドレスをブラウザに入れてアクセスすれば、そこから設定できる。
Webベースで root アカウントを使ってアクセスする。
ただし、telnet ではセキュリティの観点から root アカウントで直接アクセスすることはできない仕様になっている。
「共有フォルダ設定」から「ユーザ設定」をクリック → 新規ユーザ追加ボタンで、適当にユーザを作ってほしい。
ついでに「共有フォルダ設定」→「共有フォルダ設定」で、どんな共有フォルダ名になっているのか、確認しておいてもいいかもしれない。


ログインしたら、次のコマンドで root にスイッチする。


neko@KURO-BOX:~$ su -
Password:(ココにrootパスワードを入力)
root@KURO-BOX:~#


どのディレクトリが共有されているのかチェックする。
玄箱は、Linuxベースで動作している。
共有ファイル機能は、samba(サンバと読む)というソフトで実現されている。
これの設定ファイルを、次のコマンドで読んでみる。
root@KURO-BOX:~# cat /etc/samba/smb.conf


すると、最後のほうに、こんな記述があると思う。

[share]
comment = KURO-BOX Share Folder
path = /mnt/share
browsable = yes
printable = no
writable = yes
guest ok = yes
force create mode = 777
force directory mode = 777

share という公開フォルダに関する設定で、パスは /mnt/share のようだ。
ということで、次のコマンドでカレントディレクトリを移動。
root@KURO-BOX:~# cd /mnt/share
root@KURO-BOX:/mnt/share#


ファイル名を羅列表示させるコマンドは ls なので、次のようにコマンドを打ってみる。
root@KURO-BOX:/mnt/share# ls


???とか、よくわからない文字列は日本語のファイルやディレクトリを意味している。
文字コードの違いから、表示できないんだよね…
ってことで、次からの玄箱上での作業はアルファベットのディレクトリ「/mnt/share/gifwork」であることを前提にして話を進める。
このディレクトリは、Windows上で作成しておかないとWindows側で扱えなくなる。
玄箱自体を d:\ にマウントしてある(Windows上からは 「'玄人志向 玄箱 (192.168.1.1)' の share (D:)」とかに見えるはず)とする。
とりあえず gifwork というディレクトリを作っておこうかな。
Windows上でフォルダ「d:\gifwork」を作って、ここで作業をする。
玄箱でのディレクトリは「/mnt/share/gifwork」だ。
ここまで分かれば root ユーザである必要はないので、ログイン時のアカウントにしておく。


玄箱で、lsコマンドの表示がどのように扱われるのか、ためしに見てみた。
root@KURO-BOX:/mnt/share# exit
neko@KURO-BOX:/home# cd /mnt/share/gifwork
neko@KURO-BOX:/mnt/share/gifwork# ls


まだ、なんのファイルも置いてなかった…orz
Windowsで、適当な画像ファイル(ファイル名 work1.bmp〜work20.bmp)を置いてみて、再度テスト


neko@KURO-BOX:/mnt/share/gifwork# ls
work1.bmp work12.bmp work15.bmp work18.bmp work20.bmp work5.bmp work8.bmp
work10.bmp work13.bmp work16.bmp work19.bmp work3.bmp work6.bmp work9.bmp
work11.bmp work14.bmp work17.bmp work2.bmp work4.bmp work7.bmp


うん。
これなら大丈夫かなと思って、仮にシェルスクリプトで扱わせるコマンドを打ってみた。
neko@KURO-BOX:/mnt/share/gifwork# for x in `ls`;do echo $x ;done
work1.bmp
work10.bmp
work11.bmp
work12.bmp
work13.bmp
work14.bmp
work15.bmp
work16.bmp
work17.bmp
work18.bmp
work19.bmp
work2.bmp
work20.bmp
work3.bmp
work4.bmp
work5.bmp
work6.bmp
work7.bmp
work8.bmp
work9.bmp


1から20まで順番に扱いたいのに、1の次は10だった…orz
そうか…ファイル名の扱いは数値の並ぶ順番で、数値の意味は無視されるんだっけ…
シェルスクリプトにおける for 文では、目的の機能は難しいかもしれない。
かなり長くなったので、以下明日w