2015年6月2日火曜日

スクリプト:カレントディレクトリの拡張子一覧を抽出、表示するスクリプト

使い捨てのワンライナーですが、実際に使った上で、再利用も悪くないなというモノをメモしていきます。都度書くより速いです。

カレントディレクトリ配下ディレクトリ内の拡張子一覧を抽出、表示(以下全部というパターン)

なんとなくどんなファイル(種別)が配下にあるのか、知りたくなった場合に使います。おおざっぱです。

結果をみると置いておく気のなかったファイルがあることがわかったりします。画像はjpgで統一しているはずが、gifが混じっていたら、なんか変!ってことになります。music以下にmp3が混じっていたら、CD-RIPしなおしてflacにする必要(ロスレス化統一中につきmp3が残っていると困る)があることに気づくとか。そんなお気軽な用途にどうぞ。


locateやそのフロントエンドでやっているとらちがあかないと思う気短な諸兄に。findにしたので少し時間がかかります。

#!/bin/bash
# 名前 lsextr.sh で ~/bin に保存
# カレントディレクトリ配下ディレクトリ内の拡張子一覧を抽出、表示
# 以下の文字はないものとする。(空白、全角、英数字以外を含まない)
# 英字は小文字のみです。
# 特徴:下手にシェル関数使ったスクリプトはコケるがこれは23,544個ぐらいではこけない。だから作った。
#横一覧  下に改訂版
ls -R | perl -pe 's/^.*\.//' | grep -v : | grep -v " " |sort | uniq | grep -P '^[0-9a-z][0-9a-z][0-9a-z]' | perl -pe 's/\n/\t/'  

#縦に表示したい場合は以下を有効
ls -R | perl -pe 's/^.*\.//' | grep -v : | grep -v " " |sort | uniq | grep -P '^[0-9a-z][0-9a-z][0-9a-z]' | perl -pe 's/\n/\n/'  

#横一覧改訂版 こっちのほうがより正確のはず
find . -type f | perl -pe 's|^.*\.||' | sort | uniq | grep -P '^[0-9a-z][0-9a-z][0-9a-z]' | perl -pe 's/\n/\t/'

#縦一覧改訂版 こっちのほうがより正確のはず
find . -type f | perl -pe 's|^.*\.||' | sort | uniq | grep -P '^[0-9a-z][0-9a-z][0-9a-z]' | perl -pe 's/\n/\n/'

タブで横に整列させるか、改行で一列に並べるかだけの違いです。 

#拡張子の出現回数をカウント(またしてもだいたい)
find . -type f -name \*.\* | perl -pe 's|^(.*)(\.)(.*?)|$2$3|' | grep -v " " | perl -ne "print if ( /[a-z0-9].*?/ )" | sort |uniq -c | sort



※結果はエンターとほぼ同時に出力されます。簡単なことしかしてないので速いです。キャッシュに入っているんだと思いますが。そこはそれ。キャッシュに入っていない状態だと少し時間がかかります。無駄な処理がありますが、これをひな形に自分が書き換えるために残してあります。



#!/bin/bash

#変形版
#
#拡張子の出現回数をカウント(またしてもだいたい)。
#5文字以内の拡張子
#「~付」バックアップファイル除外


#出現回数順
find . -type f -name \*.\* | perl -pe 's|^(.*)(\.)(.*?)|$2$3|' | grep -v " " | perl -ne "print if ( /[a-z0-9].*?/ )" | cut -b 1-6 |grep -v "~"| sort |uniq -c | sort

#アルファベット順
find . -type f -name \*.\* | perl -pe 's|^(.*)(\.)(.*?)|$2$3|' | grep -v " " | perl -ne "print if ( /[a-z0-9].*?/ )" | cut -b 1-6 |grep -v "~"| sort |uniq
 




カレントディレクトリの拡張子一覧を抽出、表示

#!/bin/bash
# 名前 lsext.sh で ~/bin に保存
#カレントディレクトリの拡張子一覧を抽出、表示
# 以下の文字はないものとする。空白、全角、英数字を含まないとか。
#(大文字拡張子は、事前にリネームしておきましょう。美しくないので)
#
#横一覧
ls *.* | perl -pe 's/^.*\.//' | grep -v : | grep -v " " |sort | uniq | grep -P '^[0-9a-z][0-9a-z][0-9a-z]' | perl -pe 's/\n/\t/'

#縦に表示したい場合は以下を有効
ls *.* | perl -pe 's/^.*\.//' | grep -v : | grep -v " " |sort | uniq | grep -P '^[0-9a-z][0-9a-z][0-9a-z]' | perl -pe 's/\n/\n/'
 

大文字拡張子の一括変換については後日。sed y/A-Z/a-z/  というわけじゃなくて、このスクリプトでチェックするなら、「 sed y/A-Z/a-z/ 」パイプを真ん中あたりに挿入して下さい。チェックするために小文字にするだけで、実ファイルはもちろん変わりません。大雑把な傾向をつかむ意図なのとWindowsからファイルはもってこないので、99%拡張子大文字のファイルは当方の場合は存在しないので気にしていないだけです。



Windowsであれば、cygwinとか使って下さい。
MAC OS Xは、bashなので同じだと思います。perlが必須です。sedで代用できます。書き換えられるような方はこんなページは見ていないでしょうね。

おまけ:カレント以下にいくつファイルがありますか。

カレントのファイル数

ls -1 | wc -l

以下の方が正解っぽい。


#カレントのファイル(ディレクトリ除外数)
ls -l | grep -P "^-" | wc -l 

#カレントのディレクトリ数
ls -l | grep -P -v "^-" | wc -l

カレント配下全部のファイル数

ls -R -1 | wc -l

#このほうが正確っぽい。

find . -type f | wc -l
Linuxなのですべてファイルです。20000個超、普通のHDDという条件で数秒です。

長めのコマンドは、シェル関数登録(zshなら.zshrc )、短めはalias登録が管理の省手間を考慮するといいかなと思います。最近は、「ln -s mytool.sh 僕道具」 みたいなことをはじめています。クリックでも実行できたりするので。

伝統的には、~/bin に個別バッチスクリプトを設置するということになりましょうか。

0 件のコメント:

コメントを投稿