Jika saya ingin menyalin semua *.sofile dari srcke dstsaya akan lakukan:
cp src/*.so dst
Namun, saya ingin menyalin semua *.sofile dari src dan subdirs itu ke dalam dst. Ada petunjuk?
Jika saya ingin menyalin semua *.sofile dari srcke dstsaya akan lakukan:
cp src/*.so dst
Namun, saya ingin menyalin semua *.sofile dari src dan subdirs itu ke dalam dst. Ada petunjuk?
Jawaban:
Mencoba:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepjauh melebihi pola shell sederhana yang digunakan dalam -nameparameter find. xargsjuga jauh lebih kuat daripada -execparameter untuk find.
Jika Anda menggunakan Bash, Anda dapat mengaktifkan globstar opsi shell untuk mencocokkan file dan direktori secara rekursif:
shopt -s globstar
cp src/**/*.so dst
Jika Anda perlu menemukan file yang namanya dimulai dengan ., dan / atau file di dalam dan di bawah direktori yang namanya dimulai ., tetapkan dotglobjuga opsi (misalnya dengan shopt -s dotglob). Anda dapat mengatur keduanya dalam satu perintah:
shopt -s globstar dotglob
Saya mencoba perintah yang disarankan oleh Mike:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
tetapi berakhir dengan membuang semua file ke direktori dstdengan jalur relatif mereka hilang.
Untuk menjaga path relatif, perintah perlu dimodifikasi untuk ini:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst. Jika tidak, gunakan cp --parents. Juga, pastikan untuk mengutip nama file. Jadi: ... | xargs -i cp --parents "{}" dst(perhatikan bahwa argumen terakhir cpadalah "hanya" direktori tujuan). Perintah dapat dibuat lebih pendek (dan mungkin lebih cepat) menggunakan -tbendera: ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentstidak tersedia. Saya menggunakan dittotempatnya: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Cara lain untuk melakukan ini adalah seperti ini:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cpproses: ... -exec cp -t dst/ {} +.
-execdengan ;, {}digantikan oleh satu jalur pada suatu waktu. Anda mendapatkan terpisah cpuntuk setiap file. Dengan +sintaks finddiganti {}dengan beberapa hasil (hingga batas panjang baris perintah yang ditentukan sistem; pembatasan: {}harus menjadi hal terakhir sebelumnya +, karenanya cp -t). Menciptakan dan mengakhiri suatu proses adalah hal yang relatif mahal. Untuk alasan ini, ada baiknya digunakan +kapan saja Anda mengharapkan banyak hasil. Dalam hal ini, menyalin banyak file mungkin memerlukan banyak waktu sehingga perbedaannya dapat berlalu tanpa diketahui; namun itu praktik yang baik.
Grep dapat diganti dengan menggunakan find's -name :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
finddapat melakukan pencocokan pola dan menjalankan perintah. Tidak perlu menyalurkan outputnya:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'