2017-12-13 18 views
1

検索したくないディレクトリ名のリストをスキップしながら、指定したパスの各ファイルの文字列を検索するfind関数を作成しました。私はそうのように呼ばれるように私の.bashrcファイルにこのスクリプトを配置した:検索時に複数のディレクトリをスキップする方法

findTEXTinFILES /path/to/search 'text-to-find' 

検索部分は素晴らしい作品、それが視覚的に際立っているように、それが検索テキストを色付け!しかし、私は得ることができません-pruneでリストされたディレクトリをスキップします。私はここに私が見つけることができるすべての記事を読んだが、私のために働いていない。私は運がない複数のバリエーションを試しました。だから私はいくつか質問があります:

  • どのように複数のディレクトリをスキップしますか?
  • 「 - 」や「wp-」で始まる名前など、部分的な名前のディレクトリをスキップするにはどうすればよいですか?
  • -name-pathの条件を同じスクリプトで組み合わせることはできますか?
  • 私が見逃したことがありますか?

私のサーバーは、bashシェルを備えたCENTOS 6.9 virtuozzoです。

答えて

0
function findTEXTinFILES { 

find "$1" ! \(-name .bash_history -prune \ 
    -o ! -path tmp -prune \ 
    -o ! -path short -prune \ 
    -o ! -path "*/_not_used/*" -prune \ 
    -o ! -path backups -prune \ 
    -o ! -path temp_logs -prune \ 
    -o ! -name .cpan -prune \ 
    -o ! -name .cpobjcache -prune \ 
    -o ! -path files_to_compare -prune \ 
    -o ! -path logs -prune \ 
    -o ! -path mail -prune \ 
    -o ! -path old -prune \ 
    -o ! -path '--*' -prune \ 
    -o ! -path 'wp-*' -prune \ 
    -o ! -path '*copy*' -prune \) \ 
    -o -name "*" \ 
    -exec grep $2 -I --color -Hn '$3' '{}' 2>/dev/null \; 
} 

find expression試験とがオペレータで接合アクションで主に構成されています。これは標準的な短絡方法で評価されます。つまり、結果がわかるとすぐに評価が停止され、すべての部品を評価する必要はありません(たとえばtrue or anythingtrueと評価されます)。

-pruneは、常にtrueを返すアクションです。それはのいずれかの結果に作用することができますテスト。また、デフォルト演算子は-a)です。いくつかのパス(あなたの例では例えばwp-*)の下でものを除くすべてのファイルを印刷する

ので、最も簡単な剪定の例では、次のようになります。

./wp-で始まるパスに一致するファイルについては
find . -path './wp-*' -prune -o -print 

、プルーンアクションが実行されますつまり、結果はtrueであり、OR演算子の右部分は無視することができます(つまり、ファイルは印刷されません)。ここで、-pathは相対パスと一致します。この場合、ルートは.であるため、wp-*の代わりに./wp-*と書く必要があります。二つの経路をプルーニングする

、単に延び:

find . -path './wp-*' -prune -o -path ./logs -prune -o -print 

をここで:第プルーンアクションが実行されていない場合(falseをもたらす)ことはどちらをプルーニングしない場合、チャンスは、第二に与えられます(結果false)、-printアクションが実行されます。 -pruneが評価された場合、-printはチャンスを得られません。あなたは、

find "$1" -name .bash_history -prune \ 
    -o -path "$1/tmp" -prune \ 
    -o -path "$1/short" -prune \ 
    -o -path "$1/*/_not_used/*" -prune \ 
    -o -path "$1/backups" -prune \ 
    -o -path "$1/temp_logs" -prune \ 
    -o -name "$1/.cpan" -prune \ 
    -o -name "$1/.cpobjcache" -prune \ 
    -o -path "$1/files_to_compare" -prune \ 
    -o -path "$1/logs" -prune \ 
    -o -path "$1/mail" -prune \ 
    -o -path "$1/old" -prune \ 
    -o -path "$1/--*" -prune \ 
    -o -path "$1/wp-*" -prune \ 
    -o -path "$1/*copy*" -prune \ 
    -exec grep $2 -I --color -Hn '$3' '{}' 2>/dev/null \; 

$1依存性の経路を書き込まないようにするにcd "$1"を可能とf.e.を使用します。

あなたの場合にこれを適用しますfind . ... -path ./logs ...

+1

偉大な答えです。ありがとう!短絡説明のための+1。現在のパス( '$ 1')を追加すると動作するようです。私は前に説明したことを見ていなかった。しかし、それでもうまくいかない状況がいくつかあります... テストのために、私は新しいディレクトリを作成し、検索するファイルを追加しましたが、スクリプトでは取り上げられていませんが、裸の 'find'。奇妙な。 '-o -name" $ 1/* copy * "-prune \"を追加することで、名前に 'copy'という単語を含むファイルをスキップしようとしましたが、まだ検索中に返されています。 –

+0

ありがとうございました! (あなたの問題を解決すれば、それを[受け入れる](https://stackoverflow.com/help/someone-answers)に自由に感じてください:-))。あなたの '$ 1/* copy *'検索に関して、あなたは '-name'テストでパスを指定することはできません(' -path'のみで)。単語 'copy'を含むパスを削除するには、' -name '* copy *' -prune'を使います。 – randomir

関連する問題