を使用してlinuxでファイルを検索するときに、何らかの種類の進行情報を表示する方法があるかどうか疑問に思っていましたfind
。私は頻繁にそれを行う任意のスクリプトがあります。私自身は、大きなディスク上のファイルを検索し、進行状況インジケータのいくつかの種類がバーまたは少なくとも現在のディレクトリ内の検索を「見つける」のような、非常に有用だろう見つける、あるいはんfind
いくつかのフックをサポート?
を使用してlinuxでファイルを検索するときに、何らかの種類の進行情報を表示する方法があるかどうか疑問に思っていましたfind
。私は頻繁にそれを行う任意のスクリプトがあります。私自身は、大きなディスク上のファイルを検索し、進行状況インジケータのいくつかの種類がバーまたは少なくとも現在のディレクトリ内の検索を「見つける」のような、非常に有用だろう見つける、あるいはんfind
いくつかのフックをサポート?
回答:
このトリックを使用すると、現在のフォルダーを表示できますが、進行状況バーは表示されません-申し訳ありません。
watch readlink -f /proc/$(pidof find)/cwd
pv(パイプビューア)と呼ばれる小さなユーティリティが役立ちます。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は惨めに失敗しました。これらのコマンドはすぐに結果を返すため、進行状況バーはおそらくここでは意味がありません。
とにかく、いじってみて、これがあなたが必要とするものに対してまったく動作するかどうか確かめてください。少なくとも思考の糧。
find
、pv
検索にかかる時間も分からないため、パーセンテージを計算できません。pv
出力に表示されるのは、検索が開始されてからの時間だけです。
yes | pv > /dev/null
観察する
今日これを検索して、Googleでここにたどり着きました。OS Xで実行している長期にわたる検索結果watch
があり、明らかに存在しません。そこで、別のソリューションを紹介します。
lsof -Fn -a -c find -d cwd +r 10
lsof
=開いているファイルのリスト-Fn
=ファイル/ディレクトリの名前を表示するだけです(「n」文字が前に付きます。完全なlsof
出力を希望する場合は、これをスキップしてください)-a
= すべての条件にlsof
一致する行のみを表示するように指示します(デフォルトでは、任意の条件に一致する行を表示します)-c find
=指定されたプロセスによって開かれたファイル/ディレクトリを表示しますfind
(実際には、名前がで始まるプロセスですがfind
、大文字と小文字が区別さFinder
れるため表示されません)-d cwd
= FD(ファイル記述子)cwd(現在の作業ディレクトリ)で行を表示+r 10
=開いているファイルが見つからなくなるまで10秒ごとに出力を表示します(検索は終了します)これにより、ディレクトリfind
が10秒ごとに処理されていることが示されるため、find
まだ動作しているか、どの程度進行しているかがわかります。
find
in を使用した並列検索の例がありますman find
。これを使用して、すべてのアイテムに対して複数のチェックを実行し、機能する条件に応じて複数のアクションを実行できます。たとえば、最初のチェックはsimple -print
で、すべての名前が標準出力に出力されます。2番目のチェックは、必要なことを行います。何かのようなもの:
find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)
2番目のチェックでもファイル名を表示する必要がある場合は、を使用してファイルの1つをstderrにリダイレクトできます-fprint /dev/stderr
。
これは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というファイルを非表示にすることです。これらのファイルは、コンソールでデータを受信して印刷するために使用されます。