Linuxの `find 'ユーティリティの幅優先オプション?


回答:


5

組み込みの検索機能はなく、GNU findさえありません。出力を後処理して、findたとえばPerlを使用して、スラッシュの数でソートできます。

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> すべての入力行のリストです。
  • $a =~ s!/!/!gは、$aソート基準として使用するのスラッシュの数です。

zshを使用できる場合:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* 現在のディレクトリとサブディレクトリ内のすべてのファイルをリストします。
  • 括弧内の要素は、glob修飾子です。
  • glob修飾子oeは、一致が返される順序を制御しREPLYます。ここではREPLY、一致するパスに最初に設定された各一致の引用符でコードを実行した後の値で並べ替えられます。
  • このコードは$REPLY、スラッシュ以外のすべてを削除するように変換します。したがって、結果は深さ1(空の結果$REPLY)のすべてで構成され、次に深さ2(最終的$REPLYには/)、深さ3(//)などのすべてで構成されます。

1
ソートポストプロセスは非常に興味深いものですが、ソートでは検索を完了する必要があり、ブレークを制御する機会はありません。
謝Jìléi


1

私の気持ちはあなたができるということです。これにはgrepなどとループが含まれますが、特に、検索を完了する必要がないというケースについては、非常にうまく機能することがわかります。

次の理由により、より多くのリソースを消費します。

  • たくさんのフォーク
  • たくさんの発見
  • 現在の深さより前の各ディレクトリは、ファイル構造の深さの合計と同じ回数だけ検索されます(実際にRAMがあれば、これは問題になりません...)

これは、次の理由により優れています。

  • bashと基本的なgnuツールを使用します
  • 必要なときにいつでも壊れる可能性があります(探しているものがフライバイで見えるように)
  • 検索ごとではなく行ごとに機能するため、後続のコマンドは検索と並べ替えを待つ必要がありません
  • 実際のファイルシステムの分離に基づいて機能するため、スラッシュが含まれるディレクトリがある場合、それ以上深く表示されません。別のパス区切り文字を構成している場合でも、問題ありません。
#!/ bin / bash 
深さ= 0

find -mindepth $ depth -maxdepth $ depth | grep '。'
行う
    depth = $((depth + 1))
やった

また、簡単に公平に(?)1行に収めることができます。

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

しかし、私は入力よりも小さなスクリプトを好む...

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