argius note

プログラミング関連

Potaufeu について

GitHubWikiページに移行しました。






Potaufeu バージョン 1.0.0-beta5(2017-04-24)時点でのマニュアル代わりのものです。

これは何か

Unix-like環境における、findコマンドに似たものです。

私はファイルを探したいことがよくあって、自分好みの検索処理を求めていました。 OSの標準検索処理は、操作が異なるうえに指定できる条件が少ないので、どのOSでも同じように使えて条件が細かく指定できるものが必要でした。

以前から似たようなものを作ってはいましたが、Java8を使って刷新したのがこれです。

「ポトフ」と読みます。これは、私がスープ料理から名前を付けるルールを採用しているためで、それ以外の意味は特にありません。

インストー

自動

/bin/sh環境と、cURLunzipが必要です。

$ curl -fsSL https://goo.gl/m54fCw | sh

URLは、https://raw.githubusercontent.com/argius/potaufeu/master/install.shの短縮です。

手動

GitHubから最新版ファイル(potaufeu-*-bin.zip)をダウンロードします。

ZIPファイルからJarファイルを取り出して適当なディレクトリーに置き、コンソールで以下のコマンドを実行し、バージョンが表示されればインストール完了です。 (/path/to/potaufeu.jarは取り出したJarファイルのフルパスを示します)

$ java -jar /path/to/potaufeu.jar --version
Potaufeu version 1.0.0-beta5 [build ... ]


推奨するコマンド名は、potfとしています。 aliasが使える環境であれば、alias potf="java -jar /path/to/potaufeu.jar"を設定しておくと良いです。 そうでなければ、スクリプトに書いて実行します。

実装について

主要な機能は、Java8で追加されたラムダ式・ストリーム、Java7で追加されたNIO.2を使って実現しています。 また、以下のライブラリーを使っています。

操作説明

基本操作は、ファイルパスに含まれる文字列の一部を指定します。 例えば、indexを指定すると、

$ potf index
index.html
index.md
index/file.txt
$

のようになります。 また、.(ピリオド)で始まるものは拡張子の検索になります。拡張子はカンマ区切りで複数指定することができ、大文字小文字は区別されません。

$ potf .java,html


ファイルパスのパターン以外にも、多数のオプションによって検索条件や表示形式を指定することができます。 詳細は後述しますが、例えば、ファイルサイズが100KBから500KBの間で、かつ最終更新日時が2017年4月のものを対象とし、結果をPOSIX風リストで出力する場合は、以下のようにします。

$ potf --size 100KB-500KB --mtime 201704 --list-posix
# 短いオプション名で書いた場合
# => $ potf -s 100KB-500KB -t 201704 -L

長いオプション名で書いていますが、一部のオプションには短いオプション名も用意されています。

さらに、短いオプションはまとめて書くことができます。 以下の例では、最終更新日時が2017年4月15日以降のファイルのみをPOSIX風リストで出力します。

$ potf -FLt 20170415-
# 長いオプション名で書いた場合
# => $ potf --file --list-posix --mtime 20170415-

オプション一覧は、--helpオプションで参照することができます。

オプション

共通事項1: 範囲パターンについて

範囲を表すのに-(ハイフン)を使うことができます。これは、ファイルサイズと時間の場合に使用できます。


ファイルサイズの指定パターンは、バイト数を指定します。また、末尾に単位KMGTPEZYのいずれかを付けることもできます。KKBは同じ意味になります。 100K-200KBを指定すると、100KB以上200KB以下の範囲になります。 100KB-を指定すると、100KB以上すべてになります。 -100KBを指定すると、100KB以下すべてになります。


時間の指定パターンは、絶対時間と相対時間があります。

絶対時間の場合は、yyyy,yyyyMM,yyyyMMdd,yyyyMMddHH,yyyyMMddHHmm,yyyyMMddHHmmssで指定することができます。 201704を指定すると、20170401から20170430の範囲になります。 20170410-20170420を指定すると、20170410から20170420の範囲になります。 20170410-を指定すると、20170410以降すべてになります。 -20170410を指定すると、20170410以前すべてになります。

相対時間の場合、数値と末尾にd,h,m,sで指定することができます。末尾の文字は大文字でも可です。 1dを指定すると、現在時刻の丸1日前、つまり24時間前から現在の範囲になります。 1d-を指定すると、現在時刻の丸1日前から以降すべてになります。 -1dを指定すると、現在時刻の丸1日前から以前すべてになります。

共通事項2: 出力形式を複数選択した場合

出力形式は複数指定された場合は、内部の優先度に従って1つだけ選択されます。例えば、-l-Lを同時に指定した場合は、-Lが優先されます。

--atime <arg> 最終アクセス日時を指定

ファイルの最終閲覧日時(atime)を指定します。 パターンの指定方法は、前述の「共通事項1」を参照。

--ctime <arg> ファイル作成日時を指定

ファイルの作成日時(ctime)を指定します。 パターンの指定方法は、前述の「共通事項1」を参照。

-d,--dir <arg> ディレクトリー

検索を開始するディレクトリーを指定します。これを指定しない場合は、カレントディレクトリーから検索を開始します。

複数のディレクトリーを指定する場合は、オプションを複数指定します。

$ potf -d dir1/ -d dir2/

--depth <arg> 最大深度を指定

検索を行うディレクトリー階層の最大深度を指定します。

ゼロを指定すると、サブディレクトリーを検索しません。

--exts 拡張子セットを出力

見つかったファイルの拡張子の一覧を結果として出力します。 拡張子が無いものは、空文字列として扱われます。

並び順は見つかった順番になります。並べ替えたい場合はsortコマンドなどを使ってください。

-F,--file ファイルのみ検索

検索対象をファイルのみに限定します。

--fullpath フルパスで出力

見つかったファイルをフルパスで出力します。

-g,--grep <arg> GREP(ファイル行一致)

ファイル内に指定した文字列と部分一致する行を探します。

結果は、ファイルパス+行番号+行で出力されます。他の出力形式は無視されます。

--head <arg> 先頭のn件を表示

結果のうち、先頭から指定した行数だけを出力します。

条件に一致したものが見つかり次第、検索を(可能な限り)早く終わらせることができます。

--heads 先頭の10件を表示

--head 10と同じです。

--help ヘルプを表示

ヘルプ(主にオプション一覧)を表示します。

-L,--list-posix POSIX風リスト形式で出力

結果をUnix-like環境におけるls -lと似たような形式で出力します。

Windowsではかなり不完全になります。

-l,--list シンプルリスト形式で出力

ファイルサイズ、最終更新日時、パスをリスト出力します。

--list-detail 詳細リスト形式で出力

ファイルサイズ、作成日時、最終更新日時、、最終アクセス日時、パス、をリスト出力します。

--list-lines パスとファイル行数のリストを出力

ファイルの総行数、ファイルサイズ、パス、をリスト出力します。

-n,--name <arg> ファイル名の条件を指定

パスでなく、ファイル名に一致する条件を指定します。

-q,--quiet 出力しない

条件に一致したパスを出力しません。

-S,--sort <arg> 指定したキーでソート

結果をソートして出力します。 デフォルトでは昇順でソートします。キー名の先頭に_(アンダースコア)を付けると、降順になります。

指定できるキーは、以下の通りです。

  • size(ファイルサイズ)
  • ctime(作成日時)
  • mtime(最終更新日時)
  • atime(最終アクセス日時)
  • name(ファイル名)
  • iname(ファイル名 大文字小文字を区別しない)


$ potf --sort _size -l
# => ファイルサイズの降順(大きい順)にソートして出力

-s,--size <arg> ファイルサイズを指定(範囲可)

ファイルサイズの条件を指定します。 パターンの指定方法は、前述の「共通事項1」を参照。

--slash パス区切り表示に常にスラッシュ(/)を使う

Windowsの場合でも、パス区切り文字を常に/(スラッシュ)として処理します。

--state 状態モード有効で起動

詳細は、後述の「状態モード」を参照して下さい。

-T,--text テキストファイル検出 (実験的)

対象がテキストファイルかどうかを指定します。

現在は、先頭の4KBがテキストであればテキストファイルとみなすようになっています。

-t,--mtime <arg> 最終更新日時を指定(範囲可)

ファイルの最終更新日時(mtime)を指定します。 パターンの指定方法は、前述の「共通事項1」を参照。

--tail <arg> 末尾のn件を表示

結果のうち、末尾の指定した行数だけを出力します。

--tails 末尾の10件を表示

--tail 10と同じです。

--verbose 詳細のメッセージを出力

検索前後に詳細のメッセージを出力します。

--version バージョンを出力

バージョンを出力します。検索は行いません。

-x,--exclude <arg> 除外パターンを指定

対象にしないパターンを指定します。

状態モードについて

検索結果をいったんメモリー上に保存して、更に絞り込んだり、異なる出力形式で表示したりできます。

通常の検索に--stateを付けて、対話モード(この名前は分かりにくいので変える予定)に入ります。

保存された結果に対して、さらに絞り込みを行うことができます。

$ potf --state -q --depth 1
Results: [#0(309)]

Potaufeu version 1.0.0-beta5 [build #45 on 2017-04-24T16:34:33Z]
  対話モードを開始します。
  ":help"を入力するとコマンドリストを表示します。

> :help
:drop n     結果リストの先頭から指定した個数を削
:label i s  結果に名前を付ける
:merge a b  2つの結果をマージする
:pick i     結果を取り出して先頭に追加
:print/:p   結果の要約を表示
:sort       現在の結果をソートして先頭に追加

:cls        スクリーンのクリア
:help       ヘルプを表示
:exit/:quit アプリケーションを終了
> 

今後の課題

  • パターンに正規表現を指定できるようにする
    • 実装はそれほど難しくないが、どのような指定形式にするか悩む

(おわり)