見つける代わりに?[閉まっている]


30

find従来のCLIインターフェイスを備えた代替プログラムはありますか?find動作し、他のほとんどのユーティリティとは非常に異なる方法でパラメータを期待します。

明確化:私は、POSIX(または少なくともGNU)コマンドラインの推奨事項のように動作し、感じるコマンドラインインターフェイスで、findとほぼ同じ機能を備えたプログラムを探しています。


7
GNU findはコマンドラインのPOSIX(またはGNU)ガイドラインを尊重しません。たとえば、パラメータの順序、単一のダッシュを含む複数文字オプションなどは、適合プログラムとは異なります。
タマスシェレイ

3
私は知っていて、いつでも私が意図したことを何とかすることができます。私は最近知ったばかりでack、より良いfindものがあるかどうか疑問に思っていました。
タマスシェレイ

2
いいえ。小さなプログラミング言語は必要ありませんが、よりシンプルで、より直感的で、一貫性のある検索結果が必要です(たとえ高度な機能が失われたとしても)。プログラムの作成を正当化するタスクに直面したとき、私はそうします。
タマスゼレイ

2
findは一貫性があり(私の答えを参照)、直感的です。プライマリーが変な名前を付けられているわけではありません。-execは実行、-printは印刷、-nameは名前の一致を意味します。実際には、前者の3および-タイプは使用ケースの95%をカバーします。他のすべての場合には、人が見つかります。
メル

3
1時間前に編集した@tamasで、locate以外に代替手段はないと言った そして、おそらくls -Rがそれについて考えるようになります。他の選択肢は、findをエミュレートするGUIプログラムです。それ以外の場合は、検索代替手段の実行内容を指定する必要があります。dir木を歩く?ファイル名をフィルターしますか?どのファイルが新しいか教えてください?
メル

回答:


11

これはよくある誤解です。

検索はオプションの構文に従います。式のプライマリとオプションを混同しているだけです:

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

代替手段はロケートです。ただし、findは独自の式構文を実装しています。これは、フィルターとアクションのオプションが豊富に用意されているためです。同じことを行うことができる代替手段はありません。単に冗長になるからです。


5
それが私のせいであるとしても、これは私の質問に答えません。
タマスシェレイ

式(1つだけ許可されますか?)、cmd(dito?)、オプション、および引数の違いは何ですか?
ユーザー不明

@user unknown-findコマンドは独自の式構文を実装します。式は、指定された場合、コマンドラインの最後の引数です。存在しない場合、式は-printに解決されます。
メル

ああ-今、[cmd]は[expression]に続いていませんが、前の行の説明です。
ユーザー不明

2
OPは、find「他のほとんどのユーティリティとはまったく異なる方法でパラメーターを期待する」と断言しています。あなたは、OPは「式のプライマリとオプションを混同している」と述べています。他のほとんどのユーティリティには、「プライマリ式」という概念さえありますか?そうでない場合、それ OPのポイントを実証していませんか?そして、それはを使用することの最も奇妙な部分ではありませんfind。他にどのCLIが関係しますか{}(もちろん、何らかの方法でエスケープする必要があります)。
カイルストランド

10

依存している機能の正確さに依存し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、グロブ修飾子のようなものはありません。


10

私は見てみます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
アンドリューランバート

1
さらに、locateはパターンも受け入れます(私は最近これを学びました)。
アダムByrtek

5

何を探していますか?通常、ソースコードファイルを検索する場合は、をご覧くださいack。基本的にはソースコード検索ツールですが、ackの-fスイッチは特定のファイルタイプに一致するファイルを検索します。

たとえば、ディレクトリ内のすべてのPerlファイルを検索する場合は、次のようにします。

ack -f --perl

ackが認識するファイルタイプが気に入らない場合は、に独自のファイルタイプを追加できます~/.ackrc

ackはのような汎用のファイルファインダーではありませんが、findソースコードを使用している場合、非常に便利です。


1
これは、ユーザーが尋ねたが、人々は、ソース(grepのような)コードで見つけるために非常に便利かもしれないものではありませんシルバーサーチャーsilversearcher-ag主要ディストリビューションのパッケージ。
パブロ

-1

すべてのプログラマーが学ぶべき素晴らしいことの1つは、次のとおりです。

#!/usr/bin/bash
find -name $<

私はより良いものを書くかもしれません -tタイプなどをフィルタリング。

編集:上記はBashスクリプトです。コマンドライン引数を受け取り、-nameオプションの値として検索に渡します。簡単な例です。私はこの答えを出したので、このpythonスクリプトを見つけました:

https://github.com/sjl/friendly-find/

インターフェースは見栄えが良いが、そのパフォーマンスはテストしていない。チェックアウトする価値があるかもしれません。


1
独自のツールステートメントを作成する場合はtrue。しかし、少なくとも、あなたの小さなスクリプトがどのように機能するかを説明してください。
ジッピー

1
$<私のBashで役に立つことは何もしていません。何を期待していますか?本当"$@"ですか?または"$1"(これは基本的にMakefileでこれが意味するものです)?
トリプリー

1
@tripleee- $<csh同等ですread-彼が意図したことだと思います。
-DarkHeart

-2

UNIXで物を見つける最も標準的な方法。

du -a <directory>|grep <pattern>| awk  '{print $2}'

1
grep | awkアンチパターンです。の無駄な使用をgrep参照してください。パターンをパラメータ化する場合は、多分du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee

非常に役立つ情報です@tripleee awkが、UNIXの哲学の大きな利点の一つは、1が(たとえば、より複雑なツールのすべての機能を理解する必要がない点であるawkとするfind希望を実行できる構造パイプラインに順に)仕事。grep | awk最適ではないかもしれません(または、高度に最適化されたパフォーマンスの高いマルチスレッドシステムではgrep、おそらく最適です!)が、それは単純です。
カイルストランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.