Bagaimana Anda menyalin semua konten dari satu direktori ke direktori lain?
Sebagai contoh:
$ cd /home/newuser
$ cp -a /backup/olduser/* .
Masalah dengan hal di atas adalah bahwa pola globing '*' cocok dengan direktori tersembunyi '.' dan '..' dan Anda berakhir dengan direktori 'pengguna lama' di dalam 'pengguna baru', serta kontennya.
Anda juga dapat melakukan sesuatu seperti ini:
$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser
Tetapi bagaimana jika pengguna baru sudah mengandung beberapa file dan direktori default?
Apa yang paling sederhana, paling benar, paling mudah diingat dan bukan cara mess-up untuk memindahkan konten dari satu direktori ke direktori lain hanya dengan menggunakan perintah 'cp' dan shell?
.
dan..
bekerja. Mau jelaskan?cp -r ./a b
tidak. Ada yang tahu kenapa?r
opsi tidak diperlukan. Thea
pilihan menyiratkanr
.-a
parameter tidak apa-apa untuk membantu dalam situasi ini. Perintahcp -r ./a/. b
akan menyalin konten, dan hanya konten, direktoria
ke direktorib
. The-a
bendera mempertahankan link, cap waktu dll, yang tidak relevan dengan pertanyaan.Dua direktori a dan b.
Keduanya memiliki file.
Anda berada di direktori yang berisi a dan b.
-r
= secara rekursif.sumber
cp
untuk menyalin direktoria
, dana/.somedotfile
berisi oleha
. jikab
ada, perintah ini akan membuat salinan persisa
atb/a
.cp -R /some/dir/* /another/dir
Ingat bahwa, secara default,
cp
menyalin direktori pertama ke direktori kedua jika direktori kedua ada.Misalnya
cp -r a b
akan menyalin direktoria
keb
. Jikab
tidak ada, itu akan dibuat dengan kontena
.Jika Anda ingin menyalin isi dari
a
dalamb
(misalnya ketika menyalin seluruh filesystem menjadi mount point) penggunaan:seperti pada jawaban sebelumnya.
Harap perhatikan juga bahwa
-a
, yang digunakan dalam beberapa jawaban lain, sama dengan-dr --preserve=all
dan akan mempertahankan cap waktu, konteks, dan atribut yang diperluas.sumber
/.
kerjanya?a/.
mewakili konten direktori 'a' sebagai lawan dari direktori itu sendiri, dalam sebagian besar situasi itu identik tetapi ketika menggunakancp -r
, itu menghindari perilaku default cp (menyalin INTO b).Kecuali Anda telah mengkonfigurasi ulang shell Anda dengan serius, pola globbing '*' tidak cocok '.' atau '..', karena Anda dapat memverifikasi hanya dengan menggunakan gema *. Apa yang dilakukan sebagai gantinya adalah menghilangkan file yang namanya dimulai dengan '.', Sehingga pendekatan Anda akan kehilangan semua file tersembunyi. Anda bisa mengubah beberapa perilaku ini dengan opsi shell, misalnya opsi dotglob di bash, tetapi itu tidak akan menjadi opsi portabel dan kuat yang Anda cari.
Jika Anda perlu melakukan ini lebih dari sekali atau dua kali, saya sarankan Anda melihat rsync atau serempak (tergantung pada kebutuhan spesifik) dengan spesifikasi sumber dan target yang dibuat dengan cermat.
Alternatif lain adalah menempatkan direktori sumber di tarball dan membukanya di atas direktori target yang ada.
sumber
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
...tar cf - .
tar adalah direktori sumber, termasuk dotfile, dan meludahkannya ke STDOUT, yang akan disalurkan ke STDIN daritar xf -
.Ini akan menyalin file normal dan tersembunyi, sambil mengecualikan direktori induk (
..
):Jika Anda tidak mengecualikan direktori induk, Anda berakhir dengan semua konten
..
di direktori tujuan Anda juga.sumber
..
(misalnya,...
atau..super-hidden
).Untuk menyalin file yang dimulai dengan titik, lakukan saja cp. * Target /
Jadi yang paling mudah adalah dengan melakukan perintah cp dua kali.
Seperti Peter Eisentraut sais, aturan globbing normal tidak termasuk .. dan. (hm, bagaimana cara mengakhiri kalimat ini?;)
Cukup gunakan -r untuk membuatnya rekursif dan -i untuk membuat cp tanyakan apakah Anda benar-benar ingin menimpa file.
sumber
*
tidak cocok.
atau..
, tetapi jika Anda gunakan.*
. Cobaecho .*
. Anda dapat mengecualikan.
dan..
dengan pola berikut:.[^.]*
..[^.]*
masih mengecualikan nama yang dimulai dengan..
(misalnya,...
atau..super-hidden
).Ini berfungsi untuk menyalin semua file dan direktori kecuali untuk direktori tersembunyi secara rekursif dari direktori saat ini ke mana pun:
sumber