find
従来のCLIインターフェイスを備えた代替プログラムはありますか?find
動作し、他のほとんどのユーティリティとは非常に異なる方法でパラメータを期待します。
明確化:私は、POSIX(または少なくともGNU)コマンドラインの推奨事項のように動作し、感じるコマンドラインインターフェイスで、findとほぼ同じ機能を備えたプログラムを探しています。
ack
、より良いfind
ものがあるかどうか疑問に思っていました。
find
従来のCLIインターフェイスを備えた代替プログラムはありますか?find
動作し、他のほとんどのユーティリティとは非常に異なる方法でパラメータを期待します。
明確化:私は、POSIX(または少なくともGNU)コマンドラインの推奨事項のように動作し、感じるコマンドラインインターフェイスで、findとほぼ同じ機能を備えたプログラムを探しています。
ack
、より良いfind
ものがあるかどうか疑問に思っていました。
回答:
これはよくある誤解です。
検索はオプションの構文に従います。式のプライマリとオプションを混同しているだけです:
find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
[cmd][--> options <--] [--> arg0..argN <--]
代替手段はロケートです。ただし、findは独自の式構文を実装しています。これは、フィルターとアクションのオプションが豊富に用意されているためです。同じことを行うことができる代替手段はありません。単に冗長になるからです。
find
「他のほとんどのユーティリティとはまったく異なる方法でパラメーターを期待する」と断言しています。あなたは、OPは「式のプライマリとオプションを混同している」と述べています。他のほとんどのユーティリティには、「プライマリ式」という概念さえありますか?そうでない場合、それは OPのポイントを実証していませんか?そして、それはを使用することの最も奇妙な部分ではありませんfind
。他にどのCLIが関係しますか{}
(もちろん、何らかの方法でエスケープする必要があります)。
依存している機能の正確さに依存しfind
ます。(主に)検索機能である場合、一部のシェルは再帰的なグロブをサポートします。と、例えばzsh
:
% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c
a/bar.c a/b/foo.c baz.c
Zshには、glob修飾子を使用してより多くの検索のような可能性があります(の終わり近くにありますman zshexpn
)。例えば:
ls -l **/*(.)
≈ find -type f -ls
ls *(m-2u:$USER:)
≈ find -mtime -2 -user $USER
Bash 4には**/
(で有効にする必要があります)がありますがshopt -s globstar
、グロブ修飾子のようなものはありません。
私は見てみますlocate
。ファイルのデータベースを調べ、指定したものと一致するパス名をすばやく出力します。
kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$
ご覧のとおり、これはサブテキスト一致です。odg
これを指定すると、d odg e と一致します。しかし、あなたがそれを与えるなら.odg
、それはしません。
ただし、欠点が1つあります。データベースが必要です。このデータベースは、状況が変わったときに更新する必要があります。ただし、Fedora 13をインストールすると、これが毎日のcrontabに入れられます。
locate
何を探していますか?通常、ソースコードファイルを検索する場合は、をご覧くださいack
。基本的にはソースコード検索ツールですが、ackの-f
スイッチは特定のファイルタイプに一致するファイルを検索します。
たとえば、ディレクトリ内のすべてのPerlファイルを検索する場合は、次のようにします。
ack -f --perl
ackが認識するファイルタイプが気に入らない場合は、に独自のファイルタイプを追加できます~/.ackrc
。
ackはのような汎用のファイルファインダーではありませんが、find
ソースコードを使用している場合、非常に便利です。
すべてのプログラマーが学ぶべき素晴らしいことの1つは、次のとおりです。
#!/usr/bin/bash
find -name $<
私はより良いものを書くかもしれません -t
タイプなどをフィルタリング。
編集:上記はBashスクリプトです。コマンドライン引数を受け取り、-nameオプションの値として検索に渡します。簡単な例です。私はこの答えを出したので、このpythonスクリプトを見つけました:
https://github.com/sjl/friendly-find/
インターフェースは見栄えが良いが、そのパフォーマンスはテストしていない。チェックアウトする価値があるかもしれません。
$<
私のBashで役に立つことは何もしていません。何を期待していますか?本当"$@"
ですか?または"$1"
(これは基本的にMakefileでこれが意味するものです)?
$<
とcsh
同等ですread
-彼が意図したことだと思います。
UNIXで物を見つける最も標準的な方法。
du -a <directory>|grep <pattern>| awk '{print $2}'
grep | awk
アンチパターンです。の無駄な使用をgrep
参照してください。パターンをパラメータ化する場合は、多分du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
awk
が、UNIXの哲学の大きな利点の一つは、1が(たとえば、より複雑なツールのすべての機能を理解する必要がない点であるawk
とするfind
希望を実行できる構造パイプラインに順に)仕事。grep | awk
最適ではないかもしれません(または、高度に最適化されたパフォーマンスの高いマルチスレッドシステムではgrep
、おそらく最適です!)が、それは単純です。