Birden fazla dosya uzantısı için "find" kullanma


16

JAVA dosyalarındaki metin satırlarını saymak için aşağıdaki komutu kullanıyorum:

find . -name '*.java' | xargs wc -l

findKomut parametrelerini birden fazla dosya uzantısına uyacak şekilde nasıl değiştirebilirim ? Örneğin, yukarıdaki işlemi CPP, C ve H dosyaları için kullanmak istiyorum.


findEşleşen dosyaları aradığınız yer olduğu için bu soru aslında komutla ilgilidir.
iglvzx

1
Ayrıca, birini kullanın find -print0 | xargs -0yapısı veya daha iyi ve daha basit: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Bu, dosya adı sorunlarını (boş alanlar, yeni satırlar vb.) Önleyecektir ve (çok) iyi bir özelliğe sahiptir.
Daniel Andersson

Yanıtlar:


16

-oVEYA seçeneğini kullanın . Örneğin, bu listelemek istiyorum .cpp, .cve .hdosyaları:

find . -name \*.cpp -o -name \*.c -o -name \*.h

Ah. *Kodu olarak biçimlendirilmiş ise artık ihtiyaçları çıkış yapılmasını. Tamamen gözden kaçırdı. :)
iglvzx

Evet, iki kişi tarafından üç düzenleme yapıldı ama başardık.
JOTN

2
Bu benim için OSX üzerinde işe yaramadı (sadece son-adı * .ext eşleşti) - Aşağıdaki @smokinguns tarafından önerilen parantez kullanmak zorunda kaldı.
Gilead

2

-O seçeneğini kullanmanız gerekir. Örneğin, aşağıdaki ifade bir klasördeki tüm png, jpg ve gif dosyalarını bulur.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Eşleşme büyük / küçük harfe duyarsız olması için -iname seçeneğini kullanıyorum.


1
iname, find'ın tüm sürümlerinde mevcut değildir.
JOTN


1

Tüm cevaplar aşağı yukarı aynı olsa da, aralarında birden çok isim ve Boole operatörleri ile okunabilir bulmuyorum.

Bence bu daha zarif bir çözüm olabilir:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Hadi bunu parçalayalım

  • find . geçerli dosyadaki tüm dosyaları özyinelemeli olarak bulur (gerekirse başka bir yolla değiştir)
  • -type faramayı yalnızca dosyalarla daraltır (çok fazla hız artışı değil, yine de ...)
  • | grep -EBunu FreeBSD grep kullanan Mac OS X'te grep tanıma veya ( |) operatörü almak için kullandım , GNU grep buna gerek yok ( dosyanızı kontrol edin ).man
  • "\.java$|\.cpp$|\.c$"dosyaları içerir düzenli ifade adı uçları ile .java, .cppve .c(eklenti olanları sen gerekmez)

Daha sonra, elde edilen listeyi daha fazla işlem için borulandırabilirsiniz, örn.

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Bu örnek CRLFOS X / Linux için biten DOS / Windows satırını kaldırır LF(bu aynı zamanda OS X sedsözdizimidir, sürüm özelliklerinizi kontrol edin).


25 farklı uzantı eşleştirme parametresi kullanarak tüm video dosyası türlerini bulmak istedim. Benim için işe yarayan tek yaklaşım buydu. (Ubuntu 14.04 LTS)
Elder Geek

0

kullanım

find path/to/dir -name "*.ext1" -o -name "*.ext2"

açıklama

  1. İlk parametre aramak istediğiniz dizindir.
  2. Varsayılan olarak findözyineleme yapar.
  3. -oAçılımı -or. Yani yukarıda bu joker karakteri VEYA bunu arayın. Sadece bir desene sahipseniz, buna gerek yok -o.
  4. Joker karakter deseninin tırnak işaretleri gereklidir.
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.