Salin direktori rekursif / dalam direktori di Linux?

13

Apa cara umum yang baik untuk membuat salinan direktori rekursif / dalam di Linux yang berfungsi dalam banyak kasus? Saya telah menggunakan hal-hal sederhana seperti mantra yang cp -Rcukup rumit cpio. Adakah kekuatan atau kelemahan signifikan yang menyebabkan Anda lebih suka satu daripada yang lain? Yang mana yang paling sering Anda gunakan?

Greg Mattes
sumber

Jawaban:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Jadi sebagai jawaban atas pertanyaan Anda:

cp -a /foo /bar

Salin semuanya secara rekursif dari direktori / foo ke direktori / bar sambil mempertahankan tautan simbolis dan 'mode' 'kepemilikan' direktori / file '&' cap waktu '.

Gareth
sumber
Ini tentu saja merupakan solusi yang sangat mudah dan elegan. Pernahkah Anda menemukan kelemahan untuk pendekatan ini? Sistem file terdistribusi? Salinan yang sangat besar? Sudahkah Anda menemukan solusi lain seperti cpio, tar, atau rsync agar lebih efisien dalam beberapa kasus?
Greg Mattes
1
Kecuali ada kesalahan fisik, saya tidak pernah mengalami kegagalan 'cp' lokal dari memori (Saya hanya melakukan transfer berukuran TB) ke sembarang tempat yang terpasang secara lokal (terlepas dari pemasangan NFS atau Samba). Lihat 'PENGGUNAAN' di bawah halaman manual rsync untuk contoh-contoh yang Anda akan temukan sebagai pelajaran. Favorit saya: $ rsync --partial --progress --rsh = ssh --archive --verbose --compress foo / user @ hosname: ~ / bar (rsync -avzP)
Gareth
Seperti yang saya sebutkan di atas, -a tidak sepenuhnya portabel.
Matthew Flaschen
Ya saya tahu busybox itu, GNU & BSD cp ok. Selain kotak Unix lama yang belum pernah saya lihat apa yang tidak akan berhasil? Saya tidak benar-benar mengerti maksudnya, walaupun saya sepenuhnya memahami sentimen Zoredache tentang "Tampaknya pekerjaan selalu dilakukan dengan benar, jadi saya tidak pernah benar-benar terlihat sulit untuk menemukan penggantinya."
Gareth
@gyaresu Silakan pertimbangkan untuk membagi komentar kedua Anda menjadi jawaban lain sehingga kami dapat memberikan suaranya.
Greg Mattes
6

Saya menggunakan perintah seperti "cd $ srcdir; tar -c. | Tar -C $ destdir -x" paling sering. Tapi saya juga menggunakan rsync -a $ src $ dst.

Kekuatan terbesar dari solusi tar adalah apa yang harus saya gunakan pada sistem bertahun-tahun lalu yang tidak memiliki cpio, rsync atau cp yang akan menyalin secara rekursif. Tar cukup banyak di mana-mana. Terjebak di kepalaku karena aku sering menggunakannya, mungkin ada cara yang lebih elegan. Tampaknya selalu menyelesaikan pekerjaan dengan benar, jadi saya tidak pernah benar-benar terlihat sulit untuk menemukan penggantinya.

Sakit kepala
sumber
Saya suka argumen "ubiquity of tar". Saya mahir dalam vi untuk alasan yang sama meskipun saya lebih suka lingkungan pengeditan lainnya.
Greg Mattes
-R telah lama menjadi bagian dari standar ( opengroup.org/onlinepubs/009695399/utilities/cp.html ) meskipun bukan -a.
Matthew Flaschen
@Matthew Flaschen: Apakah komentar Anda ditujukan untuk jawaban @ gyaresu?
Greg Mattes
Ini juga relevan dengan yang satu ini, karena Zoredache mengatakan dia menemukan sistem yang "tidak memiliki [...] cp yang akan menyalin secara rekursif". Pada dasarnya, -R -> portable, -a -> not portable.
Matthew Flaschen
1
Ini kembali ~ 95 dan sistem menjalankan versi 80-an Unix. Saya tidak berpikir -R adalah opsi untuk cp, tapi saya tidak yakin. Saya belajar bahwa berita gembira membaca usenet.
Zoredache
6

Lihatlah rsync ... Saya suka karena Anda menyalin lebih sedikit data saat memperbarui dua direktori ... ini juga dapat bekerja secara remote. Dalam bentuknya yang paling sederhana rsync -a / src / dest

trent
sumber
Ini adalah poin yang sangat bagus. Pada dasarnya rsync memiliki kemampuan untuk menghitung "direktori diff" dan hanya mentransfer apa yang diperlukan untuk menyinkronkan direktori. Jadi Anda dapat berulang kali memanggil sesuatu seperti rsync -a src / dest untuk "secara kontinu menyalin" direktori secara rekursif (trailing / on src diperlukan untuk sinkronisasi yang tepat) sedangkan cp -a src / dest tidak berfungsi seperti itu. Perintah cp akan membuat direktori src baru di dest setelah cp pertama. Anda membutuhkan sesuatu seperti cp -au src / * dest untuk salinan selanjutnya.
Greg Mattes
Alasan lain yang saya suka rsync adalah Anda dapat memberikannya flag -P, yang menunjukkan bilah progres. Ini memberi Anda beberapa gagasan tentang berapa lama sesuatu akan terjadi
Rory
0

rsyncadalah alat yang hebat. Ini adalah pisau tentara swiss untuk mentransfer data. Ini alat yang sederhana dan kuat. Setelah Anda mulai menggunakannya, Anda ketagihan.

Rory
sumber