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}
、(.)
と同等です修飾子グロブfind
s「は-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
ですが、一致する場合を除きます。それは問題でしょうか?