Budanan dizinlerin neden findkomut 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 ./bbbu da mantıklı.
$ find . -type d ! -name aa
.
./bb
Şimdiye kadar iyi, ama kullandığımızda -prunefind 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 -prunebelirtildiği gibi adam sayfalarının bölümünde Timo cevap ama, EXPRESSIONSbölüm:
İfadesi dışında hiçbir eylemleri içeriyorsa -prune,
-printifade doğru olduğu tüm dosyalarda yapılır.
yani ifade aadizin adıyla eşleştiği için ifade true olarak değerlendirilir ve find dolaylı -printolarak tüm komutun sonuna örtülü olarak a eklediğinden yazdırılır . Bu bir eklemez -printsen bilerek eylemi eklerseniz, ancak, -o -printsonuna kendiniz için:
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
Burada find komutu -printartı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 -printbu 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 -prunefind -printkomutun SONUNDA otomatik olarak ekleyerek -prunecümlenin budanmış dizin:
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
Genel olarak, -printkomutu 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 -printyanlış 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 . findAdam sayfası bu komutla ilgili bitmeyen dünya çapında karışıklığı önlemek için güncellenmelidir.
-print, aksi takdirde örtük-printdurumun tamamı için geçerlidir