find
( -name
/ -path
standart 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 find
herhangi 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 3
bazı find
uygulamalarla). 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.
( find
glob'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 , find
sadece 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 f
diğ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
, D
dosyaları 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*bar
olanlar ve tüm hariç 2 düzeyinde quux[A-Z]
veya quux[A-Z].bak
daha sonra olanlar ve seçmek pic...
3. seviyede olanları (ve bu düzeydeki tüm dizinleri erik).
-path
veya 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ı?