検索からディレクトリを除外

検索からディレクトリを除外

findパターンに一致するすべてのファイルとディレクトリ(1つのディレクトリを除く)検索を使用する方法は?

次のようなファイル構造があるとしましょう。


  foo-除外-i/
    foo.txt
  foo-exclude-i-not/
    foo.txt
  パブ/
    foo.txt
    プバ/
      バー.txt
      foofoo.txt

次のコマンドを使用して次の出力を取得するにはどうすればよいですかfind

./bar/foo.txt
./bar/foobar
./bar/foobar/foofo.txt
./foo - 私を除く - いいえ
./foo-exclude-me-not/foo.txt

次の2つのコマンドを試しました。

探す。 -name 'foo-exclude-me' -prune -o -name 'foo*'
探す。 - 名前 'foo*' \! -パス './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

答え1

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

no を使用すると、暗黙的な-print基本操作がすべての一致、さらには整理された一致にも適用されます。明示的は、else分岐にのみ指定された-print条件にのみ適用されます。-name 'foo*'-name 'foo-exclude-me'

通常、-print述語結合よりも複雑な操作を実行するたびに明示的を使用します。

矛盾(末尾なし)! -path './foo-exclude-me/*'のため、2回目の試行は失敗します。ちょうど追加してください。./foo-exclude-me./foo-exclude-me/*/! -path ./foo-exclude-me

答え2

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

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

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

関連情報