検索を使用してサブディレクトリを除外する


115

私はこのようなディレクトリ構造を持っています

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed

Dataディレクトリ内のすべてのフォルダーに着信サブフォルダーがあります。def / incomingと456 / incoming dirsを除くすべてのフォルダーとサブフォルダーからすべてのファイルを取得したいと思います。次のコマンドで試してみました

 find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print

しかし、期待どおりに機能していません。

ラビ


3
これは良いアドバイスではありませんが、多くの状況からすばやく簡単に抜け出してしまいます。パイプを使用しgrep -v somethingて、不要なものを除外します
Miquel

回答:


206

これは機能します:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

説明:

  • find /home/feeds/data:指定したパスから再帰的に検索を開始します
  • -type f:ファイルのみを検索
  • -not -path "*def/incoming*"def/incomingそのパスの一部として何も含めないでください
  • -not -path "*456/incoming*"456/incomingそのパスの一部として何も含めないでください

エラー「find:bad option -not find:path-list predicate-list」
Ravi

@Raviはbashシェルを使用していますか?私は自分の端末でこれをテストしましたが、うまくいきました。スクリプトに変更を加えた場合は、代わりにソリューションをコピーして貼り付けてみてください。
sampson-chen

その動作はしますが、それらのリストはそれらのディレクトリ内のファイルではありません。
ラビ

1
-pathあなたがやっているのであれば、文字列全体にマッチしfind .、その後、あなたの-path文字列がする必要が./path/to/directory/*
ヒース国境

1
参考までに-not -path、この例でfindは確実に機能しますが、ディレクトリ構造を繰り返し処理し、cpuサイクルを使用してこれらすべてのディレクトリ/ファイルを繰り返し処理しています。防ぐために、findこれらのディレクトリ/ファイルを反復処理から(多分数百万のファイルがありますが)、あなたが使用する必要があります-prune-pruneオプションは、しかし、使用することは困難です)。
Trevor Boyd Smith、

9

ドキュメントのためだけに:(私がしなければならなかったように)多くの検索とスキップの星座があるので、もっと深く掘り下げる必要があるかもしれません。それpruneはあなたの友人であるかもしれませ-not -pathんが、あなたが期待することをしないでしょう。

したがって、これはディレクトリを除外する15の検索例の貴重な例です。

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

最初の質問にリンクするには、除外することは最終的に次のように私のために働きました:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

次に、1つのファイルを検索してもパスを除外する場合は、を追加し| grep myFile.txtます。

検索バージョンによっても異なる場合があります。そうですか:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5

-nameパス全体ではなく、ファイル名のみに一致します。の-pathようにディレクトリをプルーニングしている部分には、代わりに使用したいですdef/incoming


2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

7
いくつかの説明はこれをはるかに良い答えにするかもしれません。
クリスルエンゴ2018年

このコードスニペットをありがとうございます。このコードスニペットは、限られた短期間のヘルプを提供する場合があります。適切な説明は、これがなぜ問題の優れた解決策であるかを示すことにより、長期的な価値を大幅に改善し、他の同様の質問を持つ将来の読者にとってより有用になるでしょう。回答を編集して、いくつかの説明を加えてください

1
注:このトリックはfind ... -print0、後で使用する場合は機能しませんxargs -0
phs

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