Linuxでfind
を使用してファイルを検索するときに、何らかの進行情報を表示する方法があるかどうか疑問に思いました。大きなディスクでファイルを検索していることがよくあります。バーや少なくとも現在のディレクトリで「検索」するなど、何らかの進行状況インジケーターが非常に役立ちます。それを実行するスクリプト、またはfind
いくつかのフックをサポートしますか?
このトリックを使用すると、現在のフォルダーを表示できますが、プログレスバーは表示されません。
watch readlink -f /proc/$(pidof find)/cwd
pv(パイプビューア)mayと呼ばれる小さなユーティリティが役立ちます。 Peteris Kruminsによる 素晴らしい要約 から:
パイプビューアは、パイプラインを介してデータの進行状況を監視するための端末ベースのツールです。
Pvはさまざまな方法で使用できます。ここで遊んでいるとき、パイプの直後に置いて、findによって生成された出力の進行状況を監視します(stdinをそのままstdoutに渡す必要があります)
find / -mtime -1h | pv > /dev/null
次のような出力が表示されます。
6.42MB 0:01:25 [31.7kB/s] [ <=> ]
(私はstdoutを/ dev/nullにリダイレクトしたので、出力が飛ぶことなくプログレスバーの動作を確認できました。これは、おそらくfindの意図ではないので、それに応じて調整してください)
正直なところ、これが実際にどのように機能するかはわかりません。上記のような(ルートからトラバースする)「高価な」検索では、かなりうまく機能するように見えました。ディレクトリツリーのより深いノードでのより単純なコマンドの場合、pvは惨めに失敗しました。これらのコマンドは結果をすぐに返すので、プログレスバーはおそらくここでは意味がありません。
とにかく、遊んでみて、これがあなたが必要としていることに対してまったく機能するかどうかを確認してください。少なくとも、考えるための食物。
今日これを検索して、Google経由でここに行きました。私はOS Xで実行中の長期的な検索を行っていましたが、watch
はそこに存在しないようです。だからここに別の解決策があります:
lsof -Fn -a -c find -d cwd +r 10
lsof
=開いているファイルのリスト-Fn
=ファイル/ディレクトリの名前を表示するだけ(先頭に「n」文字を付けます。完全なlsof
出力が必要な場合は、これをスキップしてください)-a
= lsof
にall基準に一致する行のみを表示するように指示します(デフォルトではany基準に一致する行を表示します)-c find
= find
という名前のプロセスによって開かれたファイル/ディレクトリを表示します(実際には、名前がfind
で始まるプロセスですが、大文字と小文字が区別されるため、Finder
は表示されません)-d cwd
= FD(ファイル記述子)cwd(現在の作業ディレクトリ)で行を表示します+r 10
=開いているファイルが見つからなくなるまで(検索が終了するまで)10秒ごとに出力を表示しますこれにより、ディレクトリfind
が10秒ごとに処理されていることが示されるため、find
がまだ機能しているかどうか、およびどこまで進んだかがわかります。
_man find
_にfind
を使用した並列検索の例があります。これを使用すると、すべてのアイテムに対して複数のチェックを実行し、動作する条件に応じて複数のアクションを実行できます。最初のチェックは、たとえば、simple _-print
_の場合があるため、すべての名前がstdoutに出力されます。 2番目のチェックは、必要なことを行います。何かのようなもの:
find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)
2番目のチェックでもファイル名が表示される場合は、_-fprint /dev/stderr
_を使用してそれらの1つをstderrにリダイレクトできます。
私の知る限り、そうではなく、それを実装することは簡単ではありません。
... うーん。おそらく、find <target dir> -type d
最初にリストを保存し、次に各ディレクトリをエコーしてからfind <list item> -maxdepth 1 <rest of find parameters>
forループ内。
あなたはそれが何をしているかを漠然と見ることができる代わりにパフォーマンスの/大幅な/損失と交換していることに注意してください。
これはfindによって開かれている現在のファイルのリストなので、-findが「今」見ているのと同じです。
findによって毎秒使用されるファイル記述子のクエリアドレスとして軽量で、find自体に干渉しません。また、あなたはあなたが望むどんなプログラムでもそれをすることができます。
# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'
grep -v /dev/
は、コンソールでデータを受信して印刷するために使用されるファイルであるファイルSTDOUT、STDIN、およびSTDERRを非表示にすることです。
質問に対する正確な回答ではありませんが、find
のほとんどのユースケースは、結果を重要でない何かに実行することを含むと思います。たとえば、OCR処理のために各結果をtesseract
にパイプします。
プログレスバーを取得するエレガントな方法は、GNU Parallels with --bar
オプション(または、--progress
オプション)。
最小限の例:
seq 1000 | parallel --bar sleep
生成する:
0% 3:997=16m12s 11