検索でディレクトリを除外


11

を使用して1つのディレクトリを除外して、パターンに一致するすべてのファイルとディレクトリを見つけるにはどうすればよいfindですか?

次のファイル構造があるとします。

。
  foo-exclude-me /
    foo.txt
  foo-exclude-me-not /
    foo.txt
  バー/
    foo.txt
    foob​​ar /
      bar.txt
      foofoo.txt

を使用して次の出力をどのように取得しますかfind

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

次のコマンドの両方を使用してみました:

見つける。-name 'foo-exclude-me' -prune -o -name 'foo *'
見つける。-name 'foo *' \!-path './foo-exclude-me/*'

しかし、どちらもこれを返します:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

foo-exclude-meディレクトリを適切に除外するにはどうすればよいですか?


foo-exclude-me代わりに使用してみてください./foo-exclude-me。また-print、コマンドの最後に追加してみてください。
n0pe 2013年

@MaxMackieパーフェクト:)
Tyilo

直した?あなたのために働いた修正はどれでしたか?コメントの代わりに答えに入れることができます。
n0pe 2013年

@MaxMackieの両方-printfoo-exclude-me使用し./foo-exclude-meます。
Tyilo

素晴らしいですが、Gillesが私を倒したように見えます:)
n0pe 2013年

回答:


11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

noを-print指定すると、剪定されたものであっても、暗黙のデフォルトアクションがすべての一致に適用されます。明示-printは、指定された条件下でのみ適用されます。これは-name 'foo*'、のelseブランチにのみあり-name 'foo-exclude-me'ます。

一般的に言えば、-print述語の結合よりも複雑なことをするときはいつでも、明示を使用します。

との2回目の試行は、! -path './foo-exclude-me/*'./foo-exclude-me一致しないために機能しませんでした./foo-exclude-me/*(末尾のがありません/)。追加! -path ./foo-exclude-meは機能します。


-2
-bash-4.1 $ find。-exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r--r--。1 oradba dba 499 Jan 18 19:30 ./a.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 ./b.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 ./c.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 ./d.out

。:
合計16
-rw-r--r--。1 oradba dba 499 Jan 18 19:30 a.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 b.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 c.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 d.out
rm: `。 'を削除できません:ディレクトリです
ls:./b.outにアクセスできません:そのようなファイルまたはディレクトリはありません
ls:./d.outにアクセスできません:そのようなファイルまたはディレクトリはありません
ls:./c.outにアクセスできません:そのようなファイルまたはディレクトリはありません
。:
合計4
-rw-r--r--。1 oradba dba 499 Jan 18 19:30 a.out


プルーンオプションを使用してa.outをスキップし、問題なく動作しました-art.s
user211226

あなたは絶対になぜ-prune関連があるのか説明しません。 無効にする-pruneためfindの最も複雑なオプションの1つです-print(これはデフォルトで有効になっています)
Groochmal

-プルーンTrue; ファイルがディレクトリの場合、その中に降りないでください。-したがって、保護のためにディレクトリにそれ自体が機能することはありません。-art.s
user211226
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.