web-dev-qa-db-ja.com

findコマンドを使用するが、2つのディレクトリ内のファイルを除外する

_peaks.bedで終わるファイルを見つけたいが、tmpおよびscriptsフォルダー内のファイルを除外したい。

私のコマンドは次のとおりです。

 find . -type f \( -name "*_peaks.bed" ! -name "*tmp*" ! -name "*scripts*" \)

しかし、うまくいきませんでした。 tmpおよびscriptフォルダー内のファイルは引き続き表示されます。

これについてのアイデアはありますか?

81
Hanfei Sun

findで指定する方法は次のとおりです。

find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*"

説明:

  • find .-現在の作業ディレクトリから検索を開始します(デフォルトでは再帰的に)
  • -type f-結果にファイルのみを含めることをfindに指定する
  • -name "*_peaks.bed"-名前が_peaks.bedで終わるファイルを探します
  • ! -path "./tmp/*"-パスが./tmp/で始まるすべての結果を除外します
  • ! -path "./scripts/*"-パスが./scripts/で始まるすべての結果も除外します

ソリューションのテスト:

$ mkdir a b c d e
$ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
$ find . -type f ! -path "./a/*" ! -path "./b/*"

./d/4
./c/3
./e/a
./e/b
./e/5

-nameオプションはベース名のみを考慮しますが、-pathはパス全体を考慮します=)

180
sampson-chen

これを行う方法の1つを次に示します...

find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)"
8
alex

のようなものを試してください

find . \( -type f -name \*_peaks.bed -print \) -or \( -type d -and \( -name tmp -or -name scripts \) -and -Prune \)

少し間違えても驚かないでください。目標が(印刷ではなく)execである場合は、代わりに実行するだけです。

0
DrC

私にとって、この解決策はfindを使用したコマンドexecで動作しませんでした、なぜ本当にわからないので、私の解決策は

find . -type f -path "./a/*" -Prune -o -path "./b/*" -Prune -o -exec gzip -f -v {} \;

説明: sampson-chenと同じ

-プルーン-の処理パスを無視...

-o-一致するものがない場合、結果を出力します(ディレクトリを整理し、残りの結果を出力します)

18:12 $ mkdir a b c d e
18:13 $ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
18:13 $ find . -type f -path "./a/*" -Prune -o -path "./b/*" -Prune -o -exec gzip -f -v {} \;

gzip: . is a directory -- ignored
gzip: ./a is a directory -- ignored
gzip: ./b is a directory -- ignored
gzip: ./c is a directory -- ignored
./c/3:    0.0% -- replaced with ./c/3.gz
gzip: ./d is a directory -- ignored
./d/4:    0.0% -- replaced with ./d/4.gz
gzip: ./e is a directory -- ignored
./e/5:    0.0% -- replaced with ./e/5.gz
./e/a:    0.0% -- replaced with ./e/a.gz
./e/b:    0.0% -- replaced with ./e/b.gz
0
Al3x

以下で試すことができます:

find ./ ! \( -path ./tmp -Prune \) ! \( -path ./scripts -Prune \) -type f -name '*_peaks.bed'
0
Jacky Jiang