web-dev-qa-db-ja.com

Linux findコマンド-進行状況を表示

Linuxでfindを使用してファイルを検索するときに、何らかの進行情報を表示する方法があるかどうか疑問に思いました。大きなディスクでファイルを検索していることがよくあります。バーや少なくとも現在のディレクトリで「検索」するなど、何らかの進行状況インジケーターが非常に役立ちます。それを実行するスクリプト、またはfindいくつかのフックをサポートしますか?

24
Vlad Balmos

このトリックを使用すると、現在のフォルダーを表示できますが、プログレスバーは表示されません。

 watch readlink -f /proc/$(pidof find)/cwd
28
ThorstenS

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は惨めに失敗しました。これらのコマンドは結果をすぐに返すので、プログレスバーはおそらくここでは意味がありません。

とにかく、遊んでみて、これがあなたが必要としていることに対してまったく機能するかどうかを確認してください。少なくとも、考えるための食物。

8
tcdyl

今日これを検索して、Google経由でここに行きました。私はOS Xで実行中の長期的な検索を行っていましたが、watchはそこに存在しないようです。だからここに別の解決策があります:

lsof -Fn -a -c find -d cwd +r 10

  • lsof =開いているファイルのリスト
  • -Fn =ファイル/ディレクトリの名前を表示するだけ(先頭に「n」文字を付けます。完全なlsof出力が必要な場合は、これをスキップしてください)
  • -a = lsofall基準に一致する行のみを表示するように指示します(デフォルトではany基準に一致する行を表示します)
  • -c find = findという名前のプロセスによって開かれたファイル/ディレクトリを表示します(実際には、名前がfindで始まるプロセスですが、大文字と小文字が区別されるため、Finderは表示されません)
  • -d cwd = FD(ファイル記述子)cwd(現在の作業ディレクトリ)で行を表示します
  • +r 10 =開いているファイルが見つからなくなるまで(検索が終了するまで)10秒ごとに出力を表示します

これにより、ディレクトリfindが10秒ごとに処理されていることが示されるため、findがまだ機能しているかどうか、およびどこまで進んだかがわかります。

7
Marie Fischer

_man find_にfindを使用した並列検索の例があります。これを使用すると、すべてのアイテムに対して複数のチェックを実行し、動作する条件に応じて複数のアクションを実行できます。最初のチェックは、たとえば、simple _-print_の場合があるため、すべての名前がstdoutに出力されます。 2番目のチェックは、必要なことを行います。何かのようなもの:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

2番目のチェックでもファイル名が表示される場合は、_-fprint /dev/stderr_を使用してそれらの1つをstderrにリダイレクトできます。

5
minaev

私の知る限り、そうではなく、それを実装することは簡単ではありません。

... うーん。おそらく、find <target dir> -type d最初にリストを保存し、次に各ディレクトリをエコーし​​てからfind <list item> -maxdepth 1 <rest of find parameters> forループ内。

あなたはそれが何をしているかを漠然と見ることができる代わりにパフォーマンスの/大幅な/損失と交換していることに注意してください。

2
Shadur

これは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を非表示にすることです。

1
Gabriel Saraiva

質問に対する正確な回答ではありませんが、findのほとんどのユースケースは、結果を重要でない何かに実行することを含むと思います。たとえば、OCR処理のために各結果をtesseractにパイプします。

プログレスバーを取得するエレガントな方法は、GNU Parallels with --barオプション(または、--progressオプション)。

最小限の例:

seq 1000 | parallel --bar sleep

生成する:

0% 3:997=16m12s 11

0
tb90