Jika saya ingin menyalin semua *.so
file dari src
ke dst
saya akan lakukan:
cp src/*.so dst
Namun, saya ingin menyalin semua *.so
file dari src dan subdirs itu ke dalam dst
. Ada petunjuk?
Jika saya ingin menyalin semua *.so
file dari src
ke dst
saya akan lakukan:
cp src/*.so dst
Namun, saya ingin menyalin semua *.so
file dari src dan subdirs itu ke dalam dst
. Ada petunjuk?
Jawaban:
Mencoba:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
jauh melebihi pola shell sederhana yang digunakan dalam -name
parameter find
. xargs
juga jauh lebih kuat daripada -exec
parameter 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 dotglob
juga 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 dst
dengan 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 cp
adalah "hanya" direktori tujuan). Perintah dapat dibuat lebih pendek (dan mungkin lebih cepat) menggunakan -t
bendera: ... | xargs cp --parents -t dst
.
... | xargs cp {} --parents -t dst.
--parents
tidak tersedia. Saya menggunakan ditto
tempatnya: 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/ \;
cp
proses: ... -exec cp -t dst/ {} +
.
-exec
dengan ;
, {}
digantikan oleh satu jalur pada suatu waktu. Anda mendapatkan terpisah cp
untuk setiap file. Dengan +
sintaks find
diganti {}
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/{}
find
dapat melakukan pencocokan pola dan menjalankan perintah. Tidak perlu menyalurkan outputnya:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'