Aku berharap:
cp -R src/prog.js images/icon.jpg /tmp/package
akan menghasilkan struktur simetris di arah tujuan:
/tmp
|
+-- package
|
+-- src
| |
| +-- prog.js
|
+-- images
|
+-- icon.jpg
tetapi sebaliknya, kedua file tersebut disalin ke / tmp / package. Salinan datar. (Ini di OSX).
Apakah ada fungsi bash sederhana yang dapat saya gunakan untuk menyalin semua file, termasuk file yang ditentukan oleh wildcard (mis. Src / *. Js) ke tempat yang seharusnya di dalam direktori tujuan. Agak seperti "untuk setiap file, jalankan mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")
", tapi mungkin satu perintah.
Ini adalah utas yang relevan, yang menunjukkan bahwa itu tidak mungkin. Solusi penulis tidak begitu berguna bagi saya, karena saya hanya ingin memberikan daftar file, wildcard atau tidak, dan semuanya disalin ke direktori tujuan. IIRC MS-DOS xcopy melakukan ini, tetapi tampaknya tidak ada padanan untuk cp.
cp --parents
adalah opsi ilegal di OSX (BSD cp), tetapigcp
(GNU cp) berfungsi dengan baik. Jika belum ada di sistem Anda, gunakanbrew install coreutils
. U akan memiliki banyak utilitas dengan awalan g.cp -R --parents
danrsync -rR
menyalin file dan direktori secara relatif.Satu arah:
sumber
-C
opsi untuk melakukan chdir untuk Anda -tar cf - _files_ | tar -C /dest xf -
atau sesuatu seperti itu.Alternatifnya, jika Anda sudah tua, gunakan cpio:
Jelas, Anda dapat memfilter daftar file sesuka hati Anda.
Opsi '-p' adalah untuk mode 'pass-through' (dibandingkan dengan '-i' untuk input atau '-o' untuk output). '-V' adalah verbose (daftar file saat mereka diproses). '-M' mempertahankan waktu modifikasi. '-B' berarti gunakan 'blok besar' (di mana blok besar berukuran 5120 byte, bukan 512 byte); mungkin itu tidak berpengaruh hari ini.
sumber
-print0
dengan kombinasi--null
opsi sehingga tidak akan rusak dengan karakter khusus dan semacamnya:find . -print0 | cpio -pvdmB --null /target
cpio
untuk tugas ini. Saya setuju bahwa opsi-print0
dan-null
harus digunakan, jika tidak, pada titik tertentu, seseorang akan memberi Anda beberapa folder dengan 'karakter khusus' (spasi, kemungkinan besar) dan sesuatu akan terjadi. Bukan berarti saya berbicara dari pengalaman pribadi, tetapi Anda mungkin mencoba mencadangkan banyak file dan hanya berakhir dengan setengah dari mereka dicadangkan karena ada ruang dalam nama file. (Oke, saya berbicara dari pengalaman pribadi.)cpio
seperti yang ditunjukkan jika nama file berisi baris baru - maka biasanya Anda akan mendapatkan pesan kesalahan tentang dua (atau lebih) nama file yang tidak ditemukan untuk setiap baris baru dalam nama file. (Terkadang, Anda mungkin mendapatkan lebih sedikit pesan - tetapi itu membutuhkan perhatian yang cukup besar dalam menyusun kasus uji.). Saat saya gunakancpio
, tidak ada--null
pilihan; opsi tanda hubung ganda bukan bagian dari notasi opsi SVR4, dan konsep-print0
juga tidak adafind
. Tapi itu sudah lama sekali (pertengahan 90-an misalnya. Sebelum Linux mencapai dominasi).xargs
dalam campuran - itu terbagi di ruang kosong - kosong, tab, baris baru. OTOH, saya tidak yakin bagaimana atau mengapa Anda melakukan itu.cpio
Manul GNU pada mode keluaran jelas tentang satu nama file per baris. Panduan pengguna SVR4 (dicetak 1990) tidak jelas:cpio -o
(mode salin keluar) membaca input standar untuk mendapatkan daftar nama jalur dan menyalin file tersebut ke output standar bersama dengan nama jalur dan informasi status. Oleh karena itu, ada kemungkinan bahwa itu merusak nama di spasi.Opsi -R rsync akan melakukan apa yang Anda harapkan. Ini adalah mesin fotokopi file yang sangat kaya fitur. Sebagai contoh:
Hasil sampel:
sumber
rsync tentu saja! tutorial di sini. dan di sini
Atau serempak
sumber
Mencoba...
jadi untuk apa yang Anda lakukan awalnya ...
atau
sumber
echo
atau di$v
sini. Juga metode ini akan gagal jika direktori yang bersangkutan tidak ada di tujuan.