Linux'ta dosyaları bulma ve belirli dizinleri hariç tutma


14

Ben böyle bir bulmak var:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Bulmak "test" adlı bir dizini hariç tutmak için eklemek istiyorum ama nasıl "-type d" nasıl ekleyeceğinizi anlayamıyorum. Bunu nasıl yaptım?

Teşekkürler!

Yanıtlar:


22

-pathBulmak ve -notoperatör ile birleştirmek için bu seçeneği kullanabilirsiniz .

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Lütfen iki şeye dikkat edin

  • -path ilk argüman olarak gelmeli
  • desen tüm dosya adıyla eşleşir, bu yüzden -path testhiçbir şeyle eşleşmez

Bu arada, neden parantez kullandığınızdan emin değilim, bir fark yaratmıyor. Sadece gibi yapılar için, önceliği kullanılır ! \( -name '*bla*' -name '*foo*' \)(olduğunu, ikisine de sahip şeyleri bulmuyorum blave foo).

Başka bir ayrıntılandırma: bash döngüsünü kullanmaya gerek yok, sadece

find . ... -exec cat {} \; -exec echo \;

nerede ... diğer argümanlar find.


2
find / -path ./test -prune -o ...

./testTest dizininizin yerine uyacak şekilde yeniden adlandırın .


2
Bu durumda, -o seçeneğinden sonra -print ekle eylemini unutmayın (çünkü -print varsayılan eylem değildir)
Bill Zhao

1

Böyle grep ile deneyebilirsiniz (buradaki klasör test_folder olarak adlandırılır):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

veya bulmanız göreli yol döndürürse:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

veya aynı ada sahip ancak farklı bir yola sahip tüm klasörleri istiyorsanız

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Saygılarımla,


1

@CharlesClavadetscherCevabı ile ne düşündüğünü genişletmek için. İle bir yolu atlarsanız, yolu alçalmaya -not -path ... finddevam eder. Bunun yerine, kullanılması -prune, atlanan yola daha fazla inmesini engelleyerek daha hızlı hale getirir. Böylece şöyle bir şey yapabilirsiniz

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

Sadece bir dosya ararken "wholename" kullanmıyorum. -name gerçek dosya adını test eder , ancak -wholename tam yolu test eder. Bu nedenle yukarıdaki soruya test için yoksayma ekleme:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
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.