`` `` name` ile `Bul` ve` -exec` `-name` sadece son eşleşmeleri yürütür


74

Kullanırken

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

tüm dosya türlerini bulur. Ama -execsonunda eklediğimde :

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;

sadece .txtdosyaları yazdırıyor gibi görünüyor . Neyi yanlış yapıyorum?

Not: MINGW (Git Bash) kullanarak


İpucu: İlk komut aynı zamanda adları veya ile eşleşen dizinleri de yazacaktır . *.js**.txt
Wildcard

Yanıtlar:


99
Bul türü f-name "* .htm *" -o -name "* .js *" -o -name "* .txt"

İçin Kısa:

Bul \ (\ ( -tipi f -a -adı "* .htm *" \) -o \
          \ ( -adı "* .js *" \) -o \
          \ ( -adı "* .txt" \) \
       \) -a-izi

Yani, hiçbir eylem belirteci belirtilmediğinden (yalnızca koşullar ), -printkoşullarla eşleşen dosyalar için örtük olarak bir eylem eklenir.

(ve bu arada, bu normal olmayan .jsdosyaları ( -type fsadece .htmdosyalar için geçerlidir ) yazdıracaktır ).

Süre:

Bul türü f-name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
  -exec sh -c 'echo "$ 0"' {} \;

İçin Kısa:

Bul \ ( -tipi f -a -adı "* .htm *" \) -o \
       \ ( -adı "* .js *" \) -o \
       \ ( -adı "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)

İçin find(birçok dilde benzeri), VE ( -a; atlanmış zaman örtük) üzerinde önceliğe sahiptir VEYA ( -o) ve açık bir eylem yüklemi (burada ekleyerek -exec) iptal -printyukarıda görülen örtülü eylem. İşte, istiyorsun:

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
  -exec sh -c 'echo "$0"' {} \;

Veya:

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
   for i do
     echo "$i"
   done' sh {} +

shDosya başına bir çalıştırmayı önlemek için .


Bu sh -c kullanımlarının bazılarında, sh için sıfırıncı argümanı eklemeniz gerekir (bazılarında zaten eklediniz).
James Youngman,

1
Bu harika bir cevap!
Marinos

30

Bu örtük parantezlerdir. Açık parantez ekleyin.\( \)

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c 'echo "$0"' {} \;

veya xargs kullanarak (xargs'i seviyorum, daha kolay buluyorum, ancak görünüşe göre taşınabilir değil).

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -print0 | xargs -0 -n1 echo
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.