3

最初に現在のフォルダーを検索してから、サブフォルダーで検索を続行するように find に指示するにはどうすればよいですか? 私は次のものを持っています:

$ find . -iname '.note'
folder/1/.note
folder/2/.note
folder/3/.note
folder/.note

私が欲しいのはこれです:

$ find . -iname '.note'
folder/.note
folder/1/.note
folder/2/.note
folder/3/.note

何か案は?

4

5 に答える 5

3

findのアルゴリズムは次のとおりです。

  • コマンド ラインで指定された各パスについて、現在のエントリをそのパスにすると、次のようになります。
    1. 現在のエントリを式と照合します。
    2. 現在のエントリがディレクトリの場合、そのディレクトリ内のすべてのエントリに対して手順 1 と 2 を順不同で実行します。

プライマリでは-depth、手順 1 と 2 が逆の順序で実行されます。

あなたが求めfindているのは、ステップ2でディレクトリの前にファイルを考慮することです.しかし、findそれを行うオプションはありません.

あなたの例では、一致するファイルのすべての名前が同じディレクトリ内のサブディレクトリの名前の前に来るので、find . -iname '.note' | sortうまくいきます。しかし、それは明らかに一般化されていません。

ディレクトリの前に非ディレクトリを処理する 1 つの方法は、findコマンドを実行してディレクトリを反復処理し、別のコマンドを (場合によってfindはもう一度) そのディレクトリ内の一致するファイルを出力することです。

find -type d -exec print-matching-files-in {} \;

式を使用してfindファイルを照合する場合find、指定されたディレクトリ内の非ディレクトリのみを非再帰的に反復する 2 番目のコマンドの一般的な構造を次に示します (GNU find が必要です)。

find -type d -exec find {} -maxdepth 1 \! -type d … \;

例えば:

find -type d -exec find {} -maxdepth 1 \! -type d -iname '.note' \;

zshでは、次のように書くことができます

print -l **/(#i).note(Od)

**/サブディレクトリに再帰します。(#i)(グロビング フラグ) は、大文字と小文字を区別しないパターンとして続くものを解釈し、(Od)(グロブ修飾子) は、ディレクトリ内のファイルがサブディレクトリの前に考慮されるように、再帰的トラバーサルの結果を順序付けます。を使用(Odon)すると、出力は によって設定された制約内で辞書式に並べ替えられますOd(つまり、主要な並べ替え基準が最初になります)。

于 2010-11-18T21:12:35.517 に答える
1

回避策は次のようになりますfind . -iname '.note' | sort -r

$ find . -iname '.note' | sort -r
folder/.note
folder/3/.note
folder/2/.note
folder/1/.note

ただし、ここでは、出力は逆の順序で並べ替えられているだけであり、findの動作は変わりません。

于 2010-11-18T13:55:53.500 に答える
1

LinuxでGNU findを使用している場合、異なるテスト実行で両方の注文を取得します。

テストケース:

rm -rf /tmp/depthtest ; mkdir -p /tmp/depthtest ; cd /tmp/depthtest ; for dir in 1 2 3 . ; do mkdir -p $dir ; touch $dir/.note ; done ; find . -iname '.note'

このテストでは、ポスターの最初の結果が得られます。の順序に注意してください1 2 3 .。この順序を に変更すると. 1 2 3

rm -rf /tmp/depthtest ; mkdir -p /tmp/depthtest ; cd /tmp/depthtest ; for dir in . 1 2 3 ; do mkdir -p $dir ; touch $dir/.note ; done ; find . -iname '.note'

ポスターの 2 番目の結果を取得します。

どちらの場合でも、 find に -depth を追加しても何も起こりません。

編集:

これをさらに調べるために、perlワンライナーを書きました:

perl -e 'opendir(DH,".") ; print join("\n", readdir(DH)),"\n" ; closedir(DH)'

テストケース 1 を実行した後、/tmp/depthtest に対してこれを実行し、次の結果を得ました。

.
..
1
2
3
.note

テストケース 2 の後に再度実行すると、次の結果が得られました。

.
..
.note
1
2
3

結果がディレクトリ順であることを確認します。

検索のみの-depthオプションは、 eg./1/.noteが の前または後./1/に処理されるかどうかを制御します./.note/1/が最初であるため、結果の順序は純粋にディレクトリの順序 (主に作成順序) に基づいています。

ある場所にあるすべてのディレクトリを幅優先で再帰的に一覧表示するにはどうすればよいですか? を参照すると役立つ場合があります。この問題を回避する方法を学びます。

于 2010-11-18T18:39:28.447 に答える
0

find -s . -iname ".note"役に立たない?またはfind . -iname '.note'|sort

于 2010-11-18T13:14:29.793 に答える
0

現在のフォルダー内を検索

 find ./in_save/ -type f -maxdepth 1| more

==>73!

于 2015-02-07T22:03:39.500 に答える