Belirli bir dizinin alt dizinlerini find komutundan nasıl hariç tutabilirim?

Aug 15 2020

wc -lHepsinin kelime sayısını elde etmek için yönlendirebileceğim dosyaların bir listesini almaya çalışıyorum ( wcdoğ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 maxdepthbir 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

jeremysprofile Aug 16 2020 at 01:10

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
2 root Aug 16 2020 at 01:13

Ö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/folderdizin değildir, bu nedenle -pathcümle ile eşleşmezler .
  • doğrudan altındaki dizinler /var/www/html/foldereşleşmiyor -type f.
  • alt dizinleri altındaki dosyaların yolda /var/www/html/folderfazladan dosyaya sahip olması gerekir /, böylece -pathifadeyle eşleşirler.