Bütün kopyalamak isteseydim *.sodosyaları srciçin dstyapardım:
cp src/*.so dst
Ancak, ben her kopyalamak istediğiniz *.sosrc dosya ve 's subdirs içine dst. Herhangi bir ipucu var mı?
Bütün kopyalamak isteseydim *.sodosyaları srciçin dstyapardım:
cp src/*.so dst
Ancak, ben her kopyalamak istediğiniz *.sosrc dosya ve 's subdirs içine dst. Herhangi bir ipucu var mı?
Yanıtlar:
Deneyin:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepkullanılan basit kabuk modellerinden daha ağır olan örnek eşleştirme özellikleri de daha kolaydır . ayrıca, parametresinden çok daha güçlüdür . -namefindxargs-execfind
Bash kullanıyorsanız, dosyaları ve dizinleri tekrar tekrar eşleştirmek için globstar kabuk seçeneğini açabilirsiniz :
shopt -s globstar
cp src/**/*.so dst
Adlarıyla başlayan dosyaları .ve / veya adları ile başlayan dizinlerin içindeki ve altındaki dosyaları bulmanız gerekiyorsa ., dotglobseçeneği de (örneğin, ile shopt -s dotglob) ayarlayın. İkisini de tek bir komutla ayarlayabilirsiniz:
shopt -s globstar dotglob
Mike tarafından önerilen komutu denedim:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
ancak tüm dosyaları dstgöreceli yolları kaybedilmiş şekilde dizine dökmekle sonuçlandı .
Göreceli yolları korumak için komutun buna göre değiştirilmesi gerekir:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst. Öyle olmadığı takdirde kullanın cp --parents. Ayrıca, dosya adlarını alıntı yaptığınızdan emin olun. Böylece: ... | xargs -i cp --parents "{}" dst(son argümanın cpşimdi hedef dizinin "sadece" olduğunu unutmayın ). -t: Bayrağı ile komut daha da kısa (ve muhtemelen daha hızlı) yapılabilir ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentsmevcut değil. dittoOnun yerine kullandım : stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Bunu yapmanın başka bir yolu şudur:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cpsüreçler: ... -exec cp -t dst/ {} +.
-execile ;, {}her seferinde bir yol ile değiştirilir. cpHer dosya için ayrı bir dosya alıyorsunuz . İle +sözdizimi findyerine geçer {}birden çok sonuç (komut hattı uzunluğunun bir sistem tanımlı bir sınıra kadar, sınırlama: {}önceki son şey olması gerekir +, dolayısıyla cp -t). Bir sürecin yaratılması ve sonlandırılması nispeten maliyetli bir şeydir. Bu nedenle, +çok fazla sonuç beklediğinizde kullanmak iyidir . Bu durumda, çok sayıda dosyayı kopyalamak yine de çok zaman alabilir, bu nedenle fark fark edilmeden geçebilir; Bununla birlikte, bu iyi bir uygulamadır.
Grep, find -name kullanılarak değiştirilebilir :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
findDesen eşleştirme yapabilir ve komutları çalıştırabilir.find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'