Budanan dizinlerin neden find
komut tarafından yazdırıldığına ve nasıl -prune
çalıştığına dair diğer bazı karmaşık ayrıntılara neden şaşırdım , ancak birkaç örnekle anlayabildim.
Aşağıdaki örnekleri çalıştırmak için aşağıdaki dizinleri ve dosyaları oluşturun.
mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3
Bu yapıyı oluşturmak için:
$ tree
.
├── aa
│ └── file1
├── bb
│ └── file3
└── file1
Şimdi adlı dizinleri aramak için find komutunu kullanın aa
. Burada sorun yok.
$ find . -type d -name aa
./aa
Aa dışındaki tüm dizinleri arayın ve geçerli dizini aldık .
ve ./bb
bu da mantıklı.
$ find . -type d ! -name aa
.
./bb
Şimdiye kadar iyi, ama kullandığımızda -prune
find budama yaptığımız dizini döndürür, bu da başlangıçta beni şaşırttı çünkü budama değil diğer tüm dizinleri döndürmesini bekliyordum.
$ find . -type d -name aa -prune
./aa
Değil de, açıklanmıştır budanmış olan dizini döndürür sebebi -prune
belirtildiği gibi adam sayfalarının bölümünde Timo cevap ama, EXPRESSIONS
bölüm:
İfadesi dışında hiçbir eylemleri içeriyorsa -prune
,
-print
ifade doğru olduğu tüm dosyalarda yapılır.
yani ifade aa
dizin adıyla eşleştiği için ifade true olarak değerlendirilir ve find dolaylı -print
olarak tüm komutun sonuna örtülü olarak a eklediğinden yazdırılır . Bu bir eklemez -print
sen bilerek eylemi eklerseniz, ancak, -o -print
sonuna kendiniz için:
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
Burada find komutu -print
artık örtük DEĞİLDİR ve bu yüzden budama ( aa
) dizini yazdırılmaz.
Son olarak, dosya adı deseninden file*
sonra olan dosyaları arayan bir cümle eklersek -o
, o zaman -print
bu ikinci cümlenin sonuna bir a koymanız gerekir :
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
Bunun çalışmasının nedeni aynıdır: -print
İkinci fıkra içine a koymazsanız , eylem dışında bir işlem olmadığından -prune
find -print
komutun SONUNDA otomatik olarak ekleyerek -prune
cümlenin budanmış dizin:
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
Genel olarak, -print
komutu ikinci maddeye yerleştirmeniz gerekir . Orijinal posterin yaptığı gibi ortaya koyarsanız, düzgün çalışmaz, çünkü budama dosyaları hemen yazdırılır ve ikinci fıkra istediği dosyaları seçme şansı elde etmez:
find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3
Ne yazık ki, orijinal poster yukarıdaki komutu yanlış yere yerleştirerek -print
yanlış verdi. Özel davası için işe yaramış olabilir, ancak genel durumda işe yaramaz.
Nasıl -prune
çalıştığını anlamakta zorluk çeken binlerce insan var . find
Adam sayfası bu komutla ilgili bitmeyen dünya çapında karışıklığı önlemek için güncellenmelidir.
-print
, aksi takdirde örtük-print
durumun tamamı için geçerlidir