Soru Bulmayı kullanarak bir alt dizini hariç tut


Bunun gibi dizin yapısına sahibim

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

Veri dizini içindeki tüm klasörlerde gelen alt klasör var. Def / incoming ve 456 / incoming dirs dışındaki tüm klasör ve alt klasörlerden 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

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

Ravi


76
2017-11-19 19:11


Menşei


Bu iyi bir tavsiye değildir, ancak sizi birçok durumdan hızlı ve kirli hale getirecektir: grep -v something istemediğin şeyleri hariç tutmak - Miquel


Cevaplar:


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 yinelemeli bulmaya başla
  • -type f: yalnızca dosyaları bul
  • -not -path "*def/incoming*": hiçbir şey eklemeyin def/incoming yolunun bir parçası olarak
  • -not -path "*456/incoming*": hiçbir şey eklemeyin 456/incoming yolunun bir parçası olarak

143
2017-11-19 19:22



bir hata bulma "bulmak: kötü seçenek - bulunamıyor: yol listesi yüklem listesi" - Ravi
@Ravi bash kabuk kullanıyor musunuz? Bunu sadece terminalimde test ettim ve benim için çalışıyor. Komut dosyanızda değişiklikler yaptıysanız, bunun yerine kopyalamayı ve yapıştırmayı deneyin. - sampson-chen
Onun çalışması, ancak, bu dirs dosyaları değil dirs listeleme. - Ravi
@Ravi oh, üzgünüm - Ne aradığınızı karıştırdım. Değişiklik type d için -type f ve dizinler yerine dosyaları bulur (Bkz. güncellenmiş cevap) - sampson-chen
Harika ... Teşekkürler. - Ravi


Sadece belgeleme uğruna: Çok fazla arama yapmak zorunda kalmazsınız (benim yapmam gerektiği gibi). Bu ortaya çıkabilir prune arkadaşın iken -not -path beklediğiniz şeyi yapmayacaksınız.

Bu, dizinleri hariç tutan 15 örnek örneğinin değerli bir örneğidir:

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

İlk soruyu bağlamak için, nihayet hariç olmak üzere benim için nihayet böyle ç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, yalnızca ekleyin | grep myFile.txt.

Bulduğunuz versiyona da bağlı olabilir. Anlıyorum:

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

5
2017-08-04 07:15





-name sadece dosya adıyla eşleşir, tüm yol değil. Kullanmak istiyorsun -path bunun yerine, dizinleri budamadığınız bölümler için def/incoming.


4
2017-11-19 19:16





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

1
2018-01-17 22:12



Bazı açıklamalar bunu daha iyi bir cevap haline getirebilir. - Cris Luengo
Sınırlı kısa vadeli yardımlar sağlayabilen bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama, sorunun neden bu kadar iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracaktır ve bunu gelecekteki okuyuculara diğer benzer sorularla daha yararlı hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere, bazı açıklama eklemek için lütfen cevabınızı düzenleyin - Shawn C.