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