指定した拡張子のファイルを1フォルダに抽出「ExtractImg」

Win フリーソフトUnix コマンド知ってれば一発ジャンって思うことって多い。今回はそれの典型。


指定したフォルダ以下に保存されている TXT や JPEG といった任意の拡張 子のファイルを検索して、 1 つのフォルダに抽出できるソフト。任意の拡 張子を複数指定することができ、指定した 1 つのフォルダにコピーまたは 移動することが可能だ。
ふむふむ。


find ./find-dir -name '*.TXT' -exec cp {} ./moved-dir \;
find ./find-dir -name '*.TXT' -exec mv {} ./moved-dir \;
find ./find-dir \( -name '*.TXT' -o -name '*.JPEG' -o -name '*.EXE' \) -exec cp {} ./moved-dir \;

これでよし。試してみると意外にも、大文字小文字を区別してくれちゃってる。


find ./find-dir -name '*.[tT][xX][tT]' -exec cp {} ./moved-dir \;

これで完璧。


抽出したファイルのファイル名に連番をつけて保存することも可能。また、 ファイルの作成日を期間で指定してファイルを抽出することや、"移動"を行っ た際に空となったフォルダを自動で削除する機能も搭載している。
こ、これはむずいぞ。 csh の変数の増加を使うのかな。


tcsh>set a=1;find ./find-dir -name '*.[tT][xX][tT]' -exec echo $a \; -exec @ a ++ \;
find: @: No such file or directory

  • exec は shell を解しないようだ。しかたない。 awk とか使うか。

find ./find-dir -name '*.[tT][xX][tT]' -print|cat -n|awk '{print "cp "$2" ./moved-dir/"$1}'

よしよし。実行は "|sh" を最後につける。 空白があったら死ぬけど。
次は作成日を期間で指定か。 -mtime なら、一日単位で指定可能。以下は 1 日以上 365 日以内。


find ./ -name '*.[tT][xX][tT]' -mtime -365 -mtime +1 -print

次は「"移動"を行った際に空となったフォルダを自動で削除する」か。 -size はファイルにしか使えないのだろうなぁ。パッと思いつくのは、「空となったフォルダを自動で削除するシェル」を作って、逐一実行することだろうね。
と思ったけど、簡単なのは


#! /usr/bin/csh
#
rmdir $1:h
#

これでうまくいくはずなんだけど、 cygwin では permission denied が出てだめだった。なぜ? 多分 find のルーチン自体がディレクトリの中に入っているからそれを win が検知してるんだろうなぁ。 実は、別の terminal でそのディレクトリに入ってたみたい。なんと。なので、下の二つはどちらでも可能です。


cygwin> mkdir moved-dir;mkdir find-dir;touch find-dir/1.txt;mkdir find-dir/find-dir2;touch find-dir/find-dir2/1.txt

cygwin> find ./find-dir -name '*.txt' -exec mv {} ./moved-dir \; -exec tmp.sh {} \;
rmdir: `./find-dir': Permission denied
rmdir: `./find-dir/find-dir2': Permission denied

cygwin> cat tmp.sh
#! /usr/bin/tcsh
#
rmdir $1:h
#


まぁ、次のようにすればよいだけだけど。


find ./find-dir -name '*.txt' -print -exec mv {} ./moved-dir \; | sed 's/\(.*\)\/.*/rmdir \1/' 

実行は "| sh" をつける。 空白フォルダ に注意。
結構時間が掛かったけど、練習にはもってこいだな。

CGREEK ツアー

ギリシア語、西欧各語などがかけるパッケージ。発音記号とかローマ字長音 (上に^をつけたり) も。

  • CGreek をダウンロード ftp://ftp.m17n.org/pub/cgreek/cgreek-meadow.tar.gz
  • 展開してホームディレクト1 に保存。 ~/cgreek-meadow というのが出来るはず。
  • meadow を起動
  • M-x load-file ~/cgreek-meadow/dotemacs.el2
  • C-x C-f sample.txt
  • shift+ 左クリックで fontset を fontset-cgreek16 に
  • メニュー → CGreek → CGreek mode でギリシャ語入力可能
  • a'/ などと入力して楽しむ。
  • メニュー → CGreek → Latin mode で西欧語入力可能
  • a' でアクセント。e/ で英語発音記号 ae To^kyo^ も。3
  • メニュー → Save Buffer → TeX format で TeX 形式で保存。 sample.txt.tex とでもして保存。
  • `C-x C-v' でもう一度開きなおすと TeX ソースが見れる。
  • 全体を選択 `C-x h' してメニュー → Convert Region → TeX to CGreek で CGreek に戻る。
  • そのままセーブすると文字コードが変になるので、メニュー → Save Buffer → CGreek Format

[1] インストールするときに設定される。何もしなければインストールしたディレクトリ。 `C-x C-f ~' でも確認可能。
[2] 失敗したときは、 meadow -q で起動。インストールディレクトリにある dot.emacs.ja を M-x load-file する。で M-x load-file~/cgreek-meadow/dotemacs.el を実行。
[3] google:ローマ字長音

CGREEK homepage

meadow-users-jp の ML より。ギリシャ語その他の表示方法。 Meadow でも簡単設定。
普通に ~/cgreek-meadow/dotemacs.el を読み込むと以下のエラーが出る。


Loading ~/cgreek-meadow/dotemacs.el (source)...
Loading cgreek-conf (source)...
Error in init file: error: "There's no room for a new private charset cgreek"

たぶん、フォント設定がバッティングしているのだろう。 meadow -q で立ち上げて読み込むと成功。 meadow 標準の dotemacs を load 、 ~/cgreek-meadow/dotemacs.el を load 。次に、 ~/cgreek-meadow/sample.txt を find-file して、 shift+ 左クリックで fontset を fontset-cgreek16 にするときちんと表示される。マウスでメニューCGeek をつついて、入力。 a で α が出るのだが続いて ' などを入力することで文字が変更される。さらに TeX 形式で保存したり、 TeX 形式から CGreek への変換なども可能。普通、保存するとき、文字コードの選択を迫られるが、とりあえずメニューの CGreek → Save Buffer から選べば問題ないし。
これはすごい。感動。