Linuxでファイルを検索し、特定のディレクトリを除外する


14

次のような検索結果があります。

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

検索で「test」というディレクトリを除外するために追加したいのですが、どういうわけか「-type d」を追加する方法がわからないようです。それをどうやってやったのですか?

ありがとう!

回答:


22

この-pathオプションを使用して、それを見つけて-not演算子と組み合わせることができます。

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

2つのことに注意してください

  • -path 最初の引数として来なければなりません
  • パターンはファイル名全体に一致するため-path test、何にも一致しません

ちなみに、括弧を使用している理由はわかりませんが、違いはありません。これは、優先順位、たとえばなどの構造に対してのみ使用されます! \( -name '*bla*' -name '*foo*' \)(つまり、blaとの両方を持つものは見つかりませんfoo)。

さらに改良:bashループを使用する必要はありません。

find . ... -exec cat {} \; -exec echo \;

ここで...はに対する他の引数findです。


2
find / -path ./test -prune -o ...

./testテストディレクトリの場所に合わせて名前を変更します。


2
この場合、-oオプションの後に-printアクションを追加することを忘れないでください(-printはデフォルトのアクションではないため)
Bill Zhao

1

次のようなgrepを試すことができます(このフォルダーの名前はtest_folderです)。

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

または、検索が相対パスを返す場合:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

または、同じ名前でパスが異なるすべてのフォルダーが必要な場合

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

宜しくお願いします、


1

私が考えてい@CharlesClavadetscherたことを彼の答えで拡大すること。でパスを省略すると、パスの-not -path ... find下降が続けられます。代わりに、を使用-pruneすると、省略されたパスへの下降が停止し、高速化されます。だから次のようなことができます

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

ファイルを検索するだけの場合は、「wholename」ではありません。 -nameは実際のファイル名をテストしますが、-wholenameはフルパスをテストします。したがって、上記の質問にテストの無視を追加します。

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.