Bagaimana saya bisa cp -r
menyalin semua file dan direktori dalam sebuah direktori
Persyaratan:
- Sertakan file tersembunyi dan direktori tersembunyi.
- Jadilah satu perintah tunggal dengan bendera untuk menyertakan yang di atas.
- Tidak perlu mengandalkan pencocokan pola sama sekali.
Peretasan saya yang jelek, tetapi berfungsi, adalah:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
Bagaimana saya bisa melakukan ini semua dalam satu perintah tanpa pencocokan pola? Bendera apa yang harus saya gunakan?
Jawaban:
Jangan tentukan file:
(Catatan yang
/home/user
belum harus ada, atau yang lain itu akan membuatnya/home/user/skel
.)sumber
/home/user/skel
memang ada?-T
(tidak ada target) per di bawah ini untuk penggunaan yang tepat. (-rT
untuk rekursif)Katakanlah Anda membuat folder baru (atau akan membuatnya) dan ingin menyalin file ke sana setelah folder dibuat
Ini akan menyalin semua file / folder secara rekursif dari
/etc/skel
ke folder yang sudah ada yang dibuat pada baris pertama.sumber
.
, perilaku ini akan memerlukannya untuk membuat direktori yang sudah ada, sehingga hanya melewatkan langkah itu..
, untuk mengubah Anda perlu menggunakanshopt -s dotglob
perintah sebelum dapat memasukkan file-file itu. Jadi dengan*
, secara default, Anda meminta untuk menyalin semua file secara rekursif dari direktori ini yang dapat diperluas menggunakan*
(yang tidak termasuk file tersembunyi secara default). Sementara di ujung yang lain.
Anda menggunakan cp untuk menyalin segala sesuatu dari "direktori ini" secara rekursif.Cara yang benar untuk melakukan ini adalah dengan menggunakan
-T (--no-target-directory)
opsi, dan salin folder secara rekursif (tanpa garis miring, tanda bintang, dll.), Yaitu:Ini akan menyalin konten
/etc/skel
ke/home/user
(termasuk file tersembunyi), membuat folder/home/user
jika tidak ada; namun-T
opsi ini mencegah konten/etc/skel
agar tidak disalin ke folder baru/home/user/skel
jika folder tersebut/home/user
ada.sumber
bash
sendiri memiliki solusi yang baik, ia memilikishell option
, Anda bisacp
,mv
dan seterusnya .:dan
Solusi di atas adalah standar
bash
CATATAN:
sumber
setopt
untuk zsh, kalau-kalau ada yang bertanya-tanya.Gunakan rsync:
rsync -rtv source_folder/ destination_folder/
sumber
rsync
itu baik, tetapi pilihan lain:Dari bantuan utama:
sumber
Jika sumber dan direktori target Anda memiliki nama yang sama, bahkan jika direktori target ada, Anda cukup mengetik:
Ini akan menyalin direktori / etc / skel ke / home /, termasuk file dan direktori tersembunyi.
Akhirnya, Anda dapat menyalin direktori dan menamainya dalam satu baris:
sumber
cp -r /etc/skel /home/user
untuk mengganti namaskel
menjadiuser
...Anda bisa menggunakan rsync.
Anda bahkan dapat menyalin dari ssh
Ada berbagai flag yang dapat Anda gunakan: -a, --archive # archive (-rlptgoD)
Halaman manual Rsync
sumber
Cara paling sederhana adalah:
Ekspresi
{.,}*
termasuk semua file dan direktori (juga dimulai dengan titik).Jika Anda tidak ingin menggunakan ekspresi di atas, maka Anda dapat menggunakan
cp
properti, yang merupakan kemampuan untuk menentukan beberapa sumber untuk satu folder target:sumber
..anything
atau...anything
dll. - stackoverflow.com/a/31438355/2351568 berisi regex yang benar untuk masalah ini. || tetapi tetap menggunakanshopt -s dotglob
masih merupakan solusi yang lebih baik!.
dan..
(yang setara dengan folder saat ini dan yang mengandungnya). || tapi tetap saja jawabannya di tautan menjelaskan lebih lanjut dan memberikan solusi.Perhatikan bahwa ada trik command-line (berfungsi di, setidaknya, sh , bash , dan ksh ): Cukup beri sufiks pada direktori from dengan slash. Ini akan mencurahkan isi dari direktori ke dalam ke direktori (ironisnya, saya pertama kali belajar tentang trik ini saat menggunakan rsync ).
Contoh:
sumber
Saya datang ke sini mencari Google untuk solusi untuk masalah yang sama, kemudian saya menyadari bahwa itu mudah dilakukan dengan mencari. Keuntungannya tidak tergantung pada shell, atau utilitas khusus yang mungkin tidak diinstal.
Saya mencoba triknya dengan trailing slash, tetapi itu tidak berhasil bagi saya.
sumber
Solusi saya untuk masalah ini ketika saya harus menyalin semua file (termasuk
.
file) ke direktori target yang mempertahankan izinnya adalah: (menimpa jika sudah ada)yes
adalah untuk secara otomatis menimpa file tujuan,r
rekursif,v
bertele-tele,p
mempertahankan izin.Perhatikan bahwa jalur sumber tidak berakhir dengan
/
(jadi semua file / direktori dan. File disalin)Direktori tujuan diakhiri dengan
/
saat kami menempatkan konten folder sumber ke tujuan secara keseluruhan.sumber
Saya telah melihat bahwa cp tidak selalu menyalin file tersembunyi dan jika Anda ingin perintah yang tampaknya berfungsi di semua dialek linux / unix Anda harus mencoba menggunakan:
sumber
Pada setidaknya K3b 2.0.3, ada kotak pertanyaan yang muncul ketika direktori ditambahkan ke proyek, yang menanyakan apakah Anda ingin memasukkan file tersembunyi ... ada juga pertanyaan yang muncul untuk menanyakan tentang termasuk tautan. Barang bagus!
sumber