Bul kullanarak bir alt dizini dışlayın


115

Bunun gibi dizin yapım var

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed

Veri dizini içindeki tüm klasörlerde gelen bir alt klasör var. Def / incoming ve 456 / incoming dizinleri dışındaki tüm klasör ve alt klasörlerdeki tüm dosyaları almak istiyorum. Aşağıdaki komutla denedim

 find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print

ancak beklendiği gibi çalışmıyor.

Ravi


3
Bu iyi bir tavsiye değil, ancak sizi birçok durumdan hızlı ve kirli bir şekilde kurtaracak: grep -v somethingistemediğiniz her şeyi dışlamak için onu boruya koyun
Miquel

Yanıtlar:


206

Bu çalışıyor:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

Açıklama:

  • find /home/feeds/data: belirtilen yoldan özyinelemeli olarak bulmaya başlayın
  • -type f: sadece dosyaları bul
  • -not -path "*def/incoming*": def/incomingyolunun bir parçası olarak hiçbir şey eklemeyin
  • -not -path "*456/incoming*": 456/incomingyolunun bir parçası olarak hiçbir şey eklemeyin

"bul: bozuk seçenek-bulamıyorum: yol listesi yüklem listesi" hatası alıyorum
Ravi

@Ravi bash kabuğu kullanıyor musunuz? Bunu terminalimde test ettim ve benim için çalışıyor. Komut dosyanızda değişiklikler yaptıysanız bunun yerine çözümü kopyalayıp yapıştırmayı deneyin.
sampson-chen

Çalışır, ancak bu dizinlerdeki dosyaları değil dizinleri listelemesi.
Ravi

1
-pathtüm dizeyle eşleşir, bu yüzden eğer yapıyorsanız find ., -pathdizelerinizin olması gerekir./path/to/directory/*
Heath Borders

1
Bilginize, -not -pathkesinlikle bu örnekte çalışacak, ancak findyine de dizin yapısında yinelemeye devam ediyor ve tüm bu dizinleri / dosyaları yinelemek için cpu döngülerini kullanıyor. findbu dizinler / dosyalar üzerinde yinelemeyi önlemek için (belki orada milyonlarca dosya vardır) sonra kullanmanız gerekir -prune( -pruneancak bu seçeneği kullanmak zordur).
Trevor Boyd Smith

9

Sırf dokümantasyon uğruna: Birçok search'n'skip takımyıldızı olduğu için (benim zorunda olduğum gibi) daha derine inmeniz gerekebilir. Beklediğiniz şeyi yapmazken prunearkadaşınız olduğu ortaya çıkabilir -not -path.

Dolayısıyla bu, dizinleri hariç tutan 15 örnek bulmanın değerli bir örneğidir:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

İlk soruya bağlantı vermek için, hariç tutma nihayet benim için şu şekilde çalıştı:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

Ardından, bir dosya bulmak ve yine de yolları hariç tutmak istiyorsanız, eklemeniz yeterlidir | grep myFile.txt.

Bulma sürümünüze de bağlı olabilir. Anlıyorum:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5

-nameyalnızca dosya adıyla eşleşir, tüm yolla eşleşmez. Bunun -pathyerine, gibi dizinleri budadığınız kısımlar için kullanmak istiyorsunuz def/incoming.


2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

7
Bazı açıklamalar bunu çok daha iyi bir cevap haline getirebilir.
Cris Luengo

Kısa vadeli sınırlı yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Uygun bir açıklama, bunun neden soruna iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Lütfen yanıtınızı düzenleyerek, yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar ekleyin
Shawn C.

1
Not: Bu numara, find ... -print0daha sonraki birxargs -0
phs

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.