Bagaimana cara menyalin dengan cp untuk memasukkan file tersembunyi dan direktori tersembunyi beserta isinya?


392

Bagaimana saya bisa cp -rmenyalin 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?


1
Lebih banyak jawaban di sini, meskipun tidak terlihat bagus; serverfault.com/questions/3154/…
Roel Van de Paar

Silakan, Eleven81, pertimbangkan untuk mengubah jawaban yang diterima untuk yang diberikan oleh @bruno pereira, karena itu menghindari membuat folder baru. Jika tidak, biarkan komentar ini menjadi peringatan bagi pembaca baru untuk memeriksa juga jawaban (yang paling banyak dipilih) lainnya. Tx.
Dr Beco

Jawaban:


265

Jangan tentukan file:

cp -r /etc/skel /home/user

(Catatan yang /home/userbelum harus ada, atau yang lain itu akan membuatnya /home/user/skel.)


61
Apakah mungkin menggunakan sesuatu yang serupa jika /home/user/skel memang ada?
bradley.ayers

@ bradley.ayers Saya pikir seseorang dapat menyalin ke subdirektori sementara kemudian memindahkannya ke tingkat atas (karena bergerak di drive yang sama cepat). Kurang dari ideal, tetapi lebih pendek dari solusi lain untuk saya.
Halil Özgür

7
@ bradley.ayers Jawaban Bruno di bawah menjawab pertanyaan Anda
Tandai

1
Solusi ini tidak berhasil untuk saya. Itu tidak menyalin file tersembunyi. Saya menggunakan rilis CentOS 6.5. @ Solusi Bruno berhasil.
Technext

2
Di bawah ubuntu / debian ini menempatkan direktori 'skel' di dalam direktori target dan bukan file yang berulang di dalam skel. Gunakan -T(tidak ada target) per di bawah ini untuk penggunaan yang tepat. ( -rTuntuk rekursif)
bshea

468

Katakanlah Anda membuat folder baru (atau akan membuatnya) dan ingin menyalin file ke sana setelah folder dibuat

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

Ini akan menyalin semua file / folder secara rekursif dari /etc/skelke folder yang sudah ada yang dibuat pada baris pertama.


5
Jika saya tidak salah, ini tidak menyalin file dot / tersembunyi.
Halil Özgür

34
Bekerja dengan baik untuk saya. Perhatikan bahwa '.' sangat penting untuk itu berfungsi.
Mark

12
Berhasil, tapi mengapa? Tidak dapat menemukan referensi untuk ini di manual.
Julien Palard

5
Saya pikir ini berfungsi karena biasanya, ini akan membuat folder baru dengan nama folder terakhir di argumen pertama. Namun, karena nama itu adalah ., perilaku ini akan memerlukannya untuk membuat direktori yang sudah ada, sehingga hanya melewatkan langkah itu.
Zenexer

28
@ Technext Global globbing di bash tidak menyertakan nama file yang dimulai dengan a ., untuk mengubah Anda perlu menggunakan shopt -s dotglobperintah 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.
Bruno Pereira

79

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:

cp -rT /etc/skel /home/user

Ini akan menyalin konten /etc/skelke /home/user(termasuk file tersembunyi), membuat folder /home/userjika tidak ada; namun -Topsi ini mencegah konten /etc/skelagar tidak disalin ke folder baru /home/user/skeljika folder tersebut /home/userada.


3
Jawaban yang benar. +1
bshea

ini memang jawaban yang tepat
Gaetan

ini adalah jawaban TERBAIK dari kelompok itu; itu satu-satunya yang memecahkan masalah tanpa menyulitkannya
ZaxLofful

persis berfungsi menyalin seperti yang diharapkan
Chetabahana

Senang ketika Anda menggunakan bendera cmd yang benar untuk satu kasus.
Tran Triet

66

bashsendiri memiliki solusi yang baik, ia memiliki shell option, Anda bisa cp, mvdan seterusnya .:

shopt -s dotglob # for considering dot files (turn on dot files)

dan

shopt -u dotglob # for don't considering dot files (turn off dot files)

Solusi di atas adalah standar bash

CATATAN:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

2
Itu berguna ketika Anda ingin menyalin konten saja tanpa membuat direktori baru di dalam tujuan. Terutama ketika tujuan dir adalah titik mount.
kaszynek

3
Ini benar-benar jawaban terbaik dan sampai ke inti pertanyaan ..
Stephen

7
Ini setoptuntuk zsh, kalau-kalau ada yang bertanya-tanya.
Pat

25

Gunakan rsync:

rsync -rtv source_folder/ destination_folder/


Pilihan terbaik bagi saya, meskipun saya menggunakan --progress untuk mendapatkan lebih banyak umpan balik pada seluruh proses.
Edenshaw

5

rsync itu baik, tetapi pilihan lain:

cp -a src/ dst/

Dari bantuan utama:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

Saya selalu menggunakan cp -r. Terima kasih telah menyebutkan cp -a
Pinaki Mukherjee

4

Jika sumber dan direktori target Anda memiliki nama yang sama, bahkan jika direktori target ada, Anda cukup mengetik:

cp -R /etc/skel /home/

Ini akan menyalin direktori / etc / skel ke / home /, termasuk file dan direktori tersembunyi.

Akhirnya, Anda dapat menyalin direktori dan menamainya dalam satu baris:

cp -R /etc/skel /home/ && mv /home/skel /home/user

Atau Anda bisa menggunakannya cp -r /etc/skel /home/useruntuk mengganti nama skelmenjadi user...
David

Itu benar, hanya jika / home / pengguna belum ada.
Gabriel Hautclocq

4

Anda bisa menggunakan rsync.

rsync -aP ./from/dir/ /some/other/directory/

Anda bahkan dapat menyalin dari ssh

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

Ada berbagai flag yang dapat Anda gunakan: -a, --archive # archive (-rlptgoD)

-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # --devices --specials

--delete         # Delete extra files

You may want to add the -P option to your command.

--partial        # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P               # The -P option is equivalent to --partial --progress.   Its  purpose  is to make it much easier to specify these two options for a long transfer that may be interrupted.

Halaman manual Rsync


4

Cara paling sederhana adalah:

cp -r /etc/skel/{.,}* /home/user

Ekspresi {.,}*termasuk semua file dan direktori (juga dimulai dengan titik).

Jika Anda tidak ingin menggunakan ekspresi di atas, maka Anda dapat menggunakan cpproperti, yang merupakan kemampuan untuk menentukan beberapa sumber untuk satu folder target:

cp -r /etc/skel/* /etc/skel/.* /home/user

1
ini akan melewatkan file seperti ..anythingatau ...anythingdll. - stackoverflow.com/a/31438355/2351568 berisi regex yang benar untuk masalah ini. || tetapi tetap menggunakan shopt -s dotglobmasih merupakan solusi yang lebih baik!
DJCrashdummy

@DJCrashdummy sayangnya, saya tidak mengerti mengapa Anda menulis perhatian Anda. Lagi pula, solusi saya memperhitungkan kasus-kasus yang Anda tulis. Salam
simhumileco

maaf teks salah! - masalah dengan jawaban Anda adalah, bahwa ia juga akan mempertimbangkan .dan ..(yang setara dengan folder saat ini dan yang mengandungnya). || tapi tetap saja jawabannya di tautan menjelaskan lebih lanjut dan memberikan solusi.
DJCrashdummy

2

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:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa

2

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.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

Saya mencoba triknya dengan trailing slash, tetapi itu tidak berhasil bagi saya.


2

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 | cp -rvp /source/directory /destination/directory/

yesadalah untuk secara otomatis menimpa file tujuan, rrekursif, vbertele-tele, pmempertahankan 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.


1

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:

cd /etc/skel
find | cpio -pdumv /home/user

-2

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!


"kotak pertanyaan yang muncul" - untuk perintah shell (CLI)?
Scott
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.