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


24

を使用してlinuxでファイルを検索するときに、何らかの種類の進行情報を表示する方法があるかどうか疑問に思っていましたfind。私は頻繁にそれを行う任意のスクリプトがあります。私自身は、大きなディスク上のファイルを検索し、進行状況インジケータのいくつかの種類がバーまたは少なくとも現在のディレクトリ内の検索を「見つける」のような、非常に有用だろう見つける、あるいはんfindいくつかのフックをサポート?


答えてくれてありがとう、私はすべての解決策をチェックし、どちらが良いかを決めます。それが私次第であれば、私はすべての回答を受け入れ済みとしてマークします。
Vlad Balmos

これに応じて、見つけ使用しているyoub検索条件は、はるかに高速検索よりもある
B14D3

回答:


28

このトリックを使用すると、現在のフォルダーを表示できますが、進行状況バーは表示されません-申し訳ありません。

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

カッコいい。cwdにアクセスするにはスーパーユーザー特権が必要であることに注意してください。ありがとう!
Vlad Balmos

完全に動作します。
ジェシーグリック14

8

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

とにかく、いじってみて、これがあなたが必要とするものに対してまったく動作するかどうか確かめてください。少なくとも思考の糧。


その進行状況バーは何を表示しますか?またfindpv検索にかかる時間も分からないため、パーセンテージを計算できません。pv出力に表示されるのは、検索が開始されてからの時間だけです。
minaev

これは正しいです。私は、どこかで、pvがディレクトリトラバーサルの進行状況をチェックできるようにする魔法があると思っていました(これは正しくありません)。一定のレートで標準入力が与えられると、pvは単に一定の頻度でプログレスバーを移動します。試しyes | pv > /dev/null観察する
tcdyl

1
素敵なユーティリティの+1
Vlad Balmos

進捗を判断するのは簡単ではありません。ページをロードするWebブラウザーでさえ、それを行うことはできません。ファイルの内容についてはファイルサイズで割ることができますが、Unixストリームの場合、通常はデータの合計量がわからないため、このツールはファイルだけでなく、あらゆる種類のストリームデータに柔軟に対応することを目的としています。
スリダールサルノバト

7

今日これを検索して、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まだ動作しているか、どの程度進行しているかがわかります。


5

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

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

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


私はこれをテストしていませんが、正しい方法だと思います。
ロルフ

2

知る限りではありませんし、それを実装するのは簡単ではありません。

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

あなたはそれが何をしているのかを漠然と見ることができるのと引き換えに、パフォーマンスの大幅な低下をトレードしていることに注意してください。


1

これは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というファイルを非表示にすることです。これらのファイルは、コンソールでデータを受信して​​印刷するために使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.