2012-01-16 7 views
34

Ben Gerçektebulmak -name "* .xyz" -o -adı "* .abc" Tüm Bulunan dosyalar üzerinde yürütme için -exec değil, sadece son eki

find ./ -name "*.xyz" -o -name "*.abc" -exec cp {} /path/i/want/to/copy/to 

yönetmeye çalışıyorum belirtilen Bu, daha geniş bir ad uzantısı listesidir, ancak bu örnek için önemli olanları bilmiyorum. Temel olarak bulunanların tümünü başka bir/path/i/want/to/copy/to kopyalamak istiyorum. Ancak sadece listedeki son isim testini yürütüyor gibi görünüyor. Ben -exec kısmını kaldırırsanız

buldum bekliyoruz dosyaların tüm varyasyonları dışarı basılır.

Bunu nasıl -exec bulunan dosyaların tam bir tamamlayıcı geçmek alabilirim? o tüm ifadenin (doğru veya yanlış) doğruluk değerini belirlemek getirene kadar verin ifadeleri değerlendirerek

cevap

45

find çalışır. Sizin durumunuzda, aslında aşağıdakileri yapıyorsunuz, çünkü varsayılan olarak AND'ler ifadeleri birlikte. Adam sayfa Quoth

-name "*.xyz" OR (-name "*.abc" AND -exec ...) 

:

GNU, aramalar soldan sağa verilen ifadeyi değerlendirerek her bir dosya adı kök dizin ağacı bulmak öncelik kurallarına göre (bkz sonuçlanana kadar bölüm OPERATÖRLERİ), (sol taraftaki noktası dosya adının yanındaki hamle bulmak hangi,), ve operasyonlar yanlışın veya doğrudur. adı *.xyz eşleşirse zaten doğru beri, hatta, ikincisi -name testi veya -exec kontrol etmeye anlamına gelir

. Yapmak istediğiniz ne

parantez ile yapabileceğiniz öncelik, zorlamak olduğunu. Jaypal çözümüyle daha fazla kullanılabilir

find ./ \(-name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \; 
+4

'-exec cp -t dir {} +' daha verimli olabilir – jfs

+0

sana "ters eğik çizgi" parantez sonra aksi takdirde bu hatayı alırsınız öncesi ve –

+0

Uzay önemli olduğu anlamına düşünüyorum "bulmak: yolları ifadesini önce olmalıdır: (-adı" . –

7
find . \(-name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \; 
+0

Yanıtınız Doğru ama Dan Fego'ya cevap vermiş gibi cevap vermiş gibi kabul ettim ve daha bilgilendirici oldu. – atxdba

13

belki olurdu: Annoyingly, ayrıca kabuk bunları kaçmak için ters eğik çizgi kullanmak gerekir

find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to 
+2

Evet, çözüm iyidir devam edip mayın silecektir 1 –

+0

daha güçlü bulmak kullanımı –

-3

O çalışabilir:

find ./ -name "*.{xyz,abc}" -exec cp {} /path/i/want/to/copy/to 
+0

Hayır, yok mu adam find' 'Dan –

+0

:.. Braces aslında buna rağmen, özel olarak tanınmamaktadır Kabuk desenlerinde özel bir anlamı olan Bash imbue diş tellerini içeren bazı kabuklar. –