find( -name/ -pathstandart tahminler için) tıpkı globlar gibi joker karakterler kullanır ( {a,b}glob operatörü değildir; genişlemeden sonra iki glob alırsınız). Temel fark, eğik çizgilerin (ve özellikle işlenmeyen nokta dosyalarının ve dizinlerin find) işlenmesidir . *globs içinde birkaç dizine yayılmaz. */*/*2 seviyeye kadar dizin listelenmesine neden olur. Bir ekleme -path './*/*/*', en az 3 düzey derinlikte olan ve findherhangi bir dizinin içeriğini herhangi bir derinlikte listelemeyi durduramayacak olan dosyalarla eşleşir .
Bu ayrıntı için
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
birkaç glob, çevirmek kolaydır, derinlik 3'te dizinler istersiniz, böylece kullanabilirsiniz:
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 {} +
(veya -depth 3bazı finduygulamalarla). Veya 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 {} +
Hangi olanlar güvence altına alacak *ve ?ulaşamasa /karakterleri.
( findglob'ların aksine, dizinlerin dışındaki dizinlerin içeriğinifoo*bar , geçerli dizinde bulunanlar dosyaların listesini sıralamaz. Ancak, eşleştirilen sorunun [A-Z]veya geçersiz karakterlerle ilgili */ ?belirtilmemişse, aynı dosya listesini alırsınız).
Ancak her durumda, muru'nun gösterdiği gibi , findsadece sistem listesini sınırlamak için birkaç dosyaya bölmek için başvurmaya gerek yoktur execve(). Bunun gibi zsh(ile zargs) veya ksh93(ile command -x) bazı mermilerin yerleşik desteği vardır.
İle zsh (globları aynı zamanda -type fdiğer tahminlere de eşdeğerdir find), örneğin:
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)aksine bir glob operatörüdür {,.bak}, (.)glob niteleyicisi find's -type f,oN olduğu gibi sıralama atlamak için orada find, Ddosyaları nokta (bu glob için geçerli değildir) içerecek şekilde)
¹ İçin find Dizin ağacını globların yaptığı gibi taramak için şöyle bir şeye ihtiyacınız var:
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 \) \)
Yani budamak haricinde 1. düzeyde tüm dizinleri foo*barolanlar ve tüm hariç 2 düzeyinde quux[A-Z]veya quux[A-Z].bakdaha sonra olanlar ve seçmek pic...3. seviyede olanları (ve bu düzeydeki tüm dizinleri erik).
-pathveya ile kullanabilirsiniz-ipath.find . -path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg'çalışması gerekir - bununla eşleşmesi dışında/fooz/blah/bar/quuxA/pic1234d.jpg. Bu sorun olacak mı?