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?
Mencoba:
find src/ -type f | grep -i 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/ ';'
grep
jauh melebihi pola shell sederhana yang digunakan dalam-name
parameterfind
.xargs
juga jauh lebih kuat daripada-exec
parameter untukfind
.Jika Anda menggunakan Bash, Anda dapat mengaktifkan
globstar
opsi shell untuk mencocokkan file dan direktori secara rekursif:Jika Anda perlu menemukan file yang namanya dimulai dengan
.
, dan / atau file di dalam dan di bawah direktori yang namanya dimulai.
, tetapkandotglob
juga opsi (misalnya denganshopt -s dotglob
). Anda dapat mengatur keduanya dalam satu perintah:sumber
Saya mencoba perintah yang disarankan oleh Mike:
tetapi berakhir dengan membuang semua file ke direktori
dst
dengan jalur relatif mereka hilang.Untuk menjaga path relatif, perintah perlu dimodifikasi untuk ini:
sumber
dst
. Jika tidak, gunakancp --parents
. Juga, pastikan untuk mengutip nama file. Jadi:... | xargs -i cp --parents "{}" dst
(perhatikan bahwa argumen terakhircp
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 menggunakanditto
tempatnya: stackoverflow.com/questions/11246070/cp-parents-option-on-macCara lain untuk melakukan ini adalah seperti ini:
sumber
cp
proses:... -exec cp -t dst/ {} +
.-exec
dengan;
,{}
digantikan oleh satu jalur pada suatu waktu. Anda mendapatkan terpisahcp
untuk setiap file. Dengan+
sintaksfind
diganti{}
dengan beberapa hasil (hingga batas panjang baris perintah yang ditentukan sistem; pembatasan:{}
harus menjadi hal terakhir sebelumnya+
, karenanyacp -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 :
sumber