Belirli bir dizinin alt dizinlerini find komutundan nasıl hariç tutabilirim?
wc -l
Hepsinin kelime sayısını elde etmek için yönlendirebileceğim dosyaların bir listesini almaya çalışıyorum ( wc
doğrudan kullanmıyorum, böylece komutu kullanmadan önce dosya listesini filtreleyebilirim).
Dizin yapım şuna benzer:
- folder
- file.php
- file2.html
- file3.php
- folder1
- folder2a
- folder3b
- folder4
- file.php
- file2.php
Büyük find
ölçüde kitaplıklarımda ve yapmadığım diğer şeylerdeki belirli dizinleri hariç tutmak istiyorum . Bunu manuel olarak şu şekilde yapabilirim:
find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a"
vb.
Bununla birlikte, tüm klasörleri açıkça belirtmek zorunda kalmak can sıkıcıdır ve liste de herhangi bir noktada değişebilir. Ben kullanarak denedim /*
ve /**
ya, desen maça ancak işliyor değil. Belirli bir dizinin tüm alt dizinleri hariç tutabilmek benim find komutu bu "değil" s biri için bir yol var mı, ama değil o dizini kendisi hariç? (dosyalarını dahil edin, ancak alt dizinlerini dahil etmeyin)?
İşte sezgisel bir tahmin:
find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)
Ama bundan bile find
şikayetçi:
find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
Yani maxdepth
bir operasyonda birleştirilemeyecek gibi görünüyor .
Belirli alt dizinlerin hariç tutulmasıyla ilgili çok sayıda Soru-Cevap vardır, ancak genel olarak belirli bir alt dizindeki herhangi bir alt dizin yoktur.
Tek bir dizinde çalışmasını sağlayabildim -maxdepth 1
, ancak sorun şu ki bu, daha büyük bir komutun dışlama kısmı ve tam komutu çalıştırdığımda bu işe yaramadı. Potansiyel olarak, belirli alt dizinleri ve diğer bazı belirli alt dizinlerdeki tüm alt dizinleri hariç tutmam gerekebilir.
Yanıtlar
Sadece bul ile:
find /var/www/html -type f -not -path '/var/www/html/folder/*/*'
Orijinal cevap:
Find'ın grep -v
çıktısında bir hack olabilir :
find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
Özellikle dosyaları aradığınızı varsayarsak (yani dizinleri değil):
find /var/www/html -type f -not -path "/var/www/html/folder/*/*"
O yüzden:
- doğrudan altındaki dosyalar
/var/www/html/folder
dizin değildir, bu nedenle-path
cümle ile eşleşmezler . - doğrudan altındaki dizinler
/var/www/html/folder
eşleşmiyor-type f
. - alt dizinleri altındaki dosyaların yolda
/var/www/html/folder
fazladan dosyaya sahip olması gerekir/
, böylece-path
ifadeyle eşleşirler.