find(-name/ -path標準述語の場合)は{a,b}、グロブと同じようにワイルドカードパターンを使用します(グロブ演算子ではないことに注意してください。展開後、2つのグロブが得られます)。主な違いは、スラッシュの処理(およびで特別に扱われないドットファイルとディレクトリfind)です。*グロブではいくつかのディレクトリにまたがることはありません。*/*/*最大2レベルのディレクトリがリストされます。を追加する-path './*/*/*'と、少なくとも3レベルの深さのすべてのファイルが一致findし、任意の深さのディレクトリの内容が一覧表示されなくなります。
その特定のために
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
いくつかのグロブ、それは翻訳が簡単です、あなたは深さ3のディレクトリが欲しいので、あなたは使うことができます:
find . -mindepth 3 -maxdepth 3 \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
(または-depth 3いくつかのfind実装)。またはPOSIXly:
find . -path './*/*/*' -prune \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
それはそれら*を保証し、文字と?一致することができませんでした/。
(findグロブとは逆foo*barに、現在のディレクトリにあるディレクトリ以外のディレクトリの内容を読み取り、ファイルのリストをソートしません。ただし、無効な文字に関する/の一致[A-Z]または動作が問題である場合を除いて、未指定の場合、同じファイルのリストが表示されます)。*?
しかし、いずれにせよ、@ muruが示したようfindに、execve()システムコールの制限を回避するために、ファイルのリストを複数の実行に分割するためだけであるかどうかに頼る必要はありません。zsh(with zargs)やksh93(with command -x)のような一部のシェルは、組み込みのサポートさえ持っています。
With zsh(これらのグロブには同等の、-type fおよび他のほとんどのfind述語もあります)、たとえば:
autoload zargs # if not already in ~/.zshrc
zargs ./foo*bar/quux[A-Z](|.bak)/pic[0-9][0-9][0-9][0-9]?.jpg(.) -- cmd
((|.bak)へのグロブ演算子反している{,.bak}、(.)と同等です修飾子グロブfinds「は-type f、追加oNと同じように並べ替えスキップし、そこにfind、D-ファイルをドット(このグロブには適用されません)を含むように)
¹ findクロールする塊のようなディレクトリツリーは、次のようなものが必要だろう。
find . ! -name . \( \
\( -path './*/*' -o -name 'foo*bar' -o -prune \) \
-path './*/*/*' -prune -name 'pic[0-9][0-9][0-9][0-9]?.jpg' -exec cmd {} + -o \
\( ! -path './*/*' -o -name 'quux[A-Z]' -o -name 'quux[A-Z].bak' -o -prune \) \)
つまりプルーン除くレベル1のすべてのディレクトリfoo*barのもの、及び除くレベル2の全てquux[A-Z]またはquux[A-Z].bak選択したもの、及びpic...レベル3でのものを(そしてそのレベルですべてのディレクトリをプルーニング)。
-pathまたはで使用できるようになります-ipath。find . -path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg'動作するはず/fooz/blah/bar/quuxA/pic1234d.jpgですが、一致する場合を除きます。それは問題でしょうか?