2012-11-19 19 views
68

Ben Veri dizininin içindeki klasörlerin tümüne gelen bir alt klasör vardır bukullanarak bir alt dizin

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

gibi dizin yapısına sahip bulmak dışlayın. Def/incoming ve 456/incoming dirs dışındaki tüm klasör ve alt klasörlerden tüm dosyaları almak istiyorum. Ben komutunu

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

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

Ravi

+1

Bu iyi tavsiye değil, ama durumların çok hızlı ve kirli dışarı alacak: 'grep -v something' sen don' her neyse dışlamak için boru t – Miquel

cevap

126

Bu çalışır:

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

Açıklama:

  • find /home/feeds/data:
  • -type f belirtilen yoldan yinelemeli bulmaya başlayacak: bulmak dosyaları yalnızca
  • -not -path "*def/incoming*": bir şey içermez bir parçası olarak def/incoming ile ts yolu
  • -not -path "*456/incoming*": gibi (Birçok search'n'skip Takımyıldızları olduğu gibi derin kazmak gerekebilir:
+0

bir hata alıyorum "bulmak: kötü seçenek-değil bulmak: yol listesi yüklem listesi" – Ravi

+0

@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. –

+0

Onun çalışması, ancak, bu dirs dosyaları değil dirs listeleme. – Ravi

4

-name sadece dosya adı, yolun tamamı değil eşleşir. Bunun yerine, def/incoming gibi dizinleri budamakta olduğunuz parçalar için -path kullanmak istiyorsunuz.

4

Sadece dokümantasyon uğruna kendi yolun bir parçası olarak 456/incoming ile bir şey içermemektedir Yapmak zorundaydım). 'un arkadaşınız olduğu ve -not -path'un beklediğiniz şeyi yapamayacağı ortaya çıkabilir.

Yani bu dizinleri hariç 15 bulmak örneklerinden değerli örneğidir:

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

ilk soruya bağlamak için nihayet hariç böyle benim için çalıştı:

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

Sonra Bir dosya bulmak ve yine de yolları hariç tutmak istiyorsanız, | grep myFile.txt'u ekleyin.

Bul 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 
0
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/" 
+2

olmalıdır. Bazı açıklamalar bunu çok daha iyi cevap. –

+0

Bazı 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 –

İlgili konular