Gizli dosyaları ve gizli dizinleri ve içeriklerini içermek için cp ile nasıl kopyalanır?


392

Bir dizindeki tüm dosya ve dizinleri kesinlikle nasıl cp -rkopyalayabilirim?

Gereksinimler:

  • Gizli dosyaları ve gizli dizinleri ekleyin.
  • Yukarıdakileri eklemek için bayraklı tek bir komut olun.
  • Desen eşleşmesine hiç bağlı kalmanıza gerek yok.

Benim çirkin, ama çalışan, kesmek:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

Desen eşleşmesi olmadan hepsini tek bir komutta nasıl yapabilirim? Hangi bayrak kullanmam gerekiyor?


1
Buradaki daha fazla cevap, iyi görünmese de; serverfault.com/questions/3154/…
Roel Van de Paar

Lütfen, Eleven81, @bruno pereira tarafından verilen cevabı değiştirmeyi düşünün, çünkü yeni bir klasör oluşturmaktan kaçınır. Olmazsa, bu yorumun diğer okuyucuların cevaplarını kontrol etmeleri için yeni okuyucular için bir uyarı olmasına izin verin. Tx.
Dr Beco,

Yanıtlar:


265

Dosyaları belirtmeyin:

cp -r /etc/skel /home/user

( /home/userZaten var olmaması gerektiğini, aksi takdirde yaratılacağını unutmayın /home/user/skel.)


61
O takdirde benzer bir şey kullanmak mümkün mü /home/user/skel geliyor var?
bradley.ayers 24:11

@ bradley.ayers Birinin geçici bir alt dizine kopyalanıp daha sonra üst seviyeye taşınabileceğini düşünüyorum (aynı sürücüde hareket etmek hızlı olduğu için). İdeal olandan daha az, fakat benim için diğer çözümlerden daha kısa.
Halil Özgür

7
@ bradley.ayers Bruno aşağıdaki cevap sorunuzu ele alıyor
Mark

1
Bu çözüm benim için işe yaramadı. Gizli dosyaları kopyalamadı. CentOS sürüm 6.5 kullanıyorum. @ Bruno'nun çözümü hile yaptı.
Technext

2
Ubuntu / debian altında bu, 'skel' dizini, dizinde bulunan dosyaları değil, hedef dizinin içine yerleştirir. -TDoğru kullanım için aşağıda hedef başına kullanın (hedef yok). ( -rTözyinelemeli)
bshea

468

Yeni klasörü oluşturduğunuzu (veya bir tane oluşturacağınızı) ve dosyaları klasör oluşturulduktan sonra kopyalamak istediğinizi varsayalım.

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

Bu, tüm dosyaları / klasörleri tekrar tekrar /etc/skelilk satırda oluşturulan mevcut klasöre kopyalar .


5
Yanlış anlamadıysam, bu gizli / nokta dosyalarını kopyalamıyordu.
Halil Özgür

34
Benim için iyi çalışıyor. '.' Olduğuna dikkat edin. çalışması için çok önemlidir.
Mark

12
İşe yarıyor ama neden? Bu kılavuzda bir referans bulamıyorum.
Julien Palard

5
Bence işe yarıyor çünkü normalde bu ilk argümandaki son klasörün ismiyle yeni bir klasör oluşturacak. Ancak, bu ad olduğundan ., bu davranış zaten mevcut bir dizin oluşturmasını gerektirir, bu yüzden bu adımı atlar.
Zenexer

28
@Technext Bash'taki varsayılan globbing, a ile başlayan dosya adlarını içermez, bu dosyaları dahil edebilmeniz için önce komutu .kullanmanız gerekir shopt -s dotglob. Bu nedenle *, varsayılan olarak, bu dosyaları kullanarak genişletilmiş *olan (varsayılan olarak gizli dosyaları içermeyen) bu dizinden yinelemeli olarak kopyalamak istiyorsunuz . Diğer .ucunuzda ise cp'yi “bu dizinden” her şeyi tekrarlı olarak kopyalamak için kullanıyorsunuz.
Bruno Pereira

79

Bunu yapmanın doğru yolu, -T (--no-target-directory)seçeneği kullanmak ve klasörleri tekrar tekrar kopyalamak (takip eden eğik çizgiler, yıldız işaretleri vb. Olmadan), yani:

cp -rT /etc/skel /home/user

Bu içeriğini kopyalar /etc/skeliçin /home/userklasör oluşturarak, (gizli dosyaları dahil) /home/usero yoksa; ancak -Tseçenek , klasör varsa , içeriğin /etc/skelyeni bir klasöre kopyalanmasını önler ./home/user/skel/home/user


3
Doğru cevap. +1
bshea

bu gerçekten de doğru cevaptı
Gaetan

bu, grubun EN İYİ cevabıdır; sorunu karmaşık hale getirmeden çözen tek kişi
ZaxLofful

tam olarak beklendiği gibi kopyalamak için çalışır
Chetabahana

Bir vaka için doğru cmd bayrağını kullanırken onu seviyorum.
Tran Triet

66

bashkendisi iyi bir çözüme sahiptir, bir vardır shell option, Yapabilirsin cp, mvvb.

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

ve

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

Yukarıdaki çözüm standart bash

NOT:

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

2
Hedef içinde yeni bir dizin oluşturmadan sadece içeriği kopyalamak istediğinizde kullanışlıdır. Özellikle hedef dir, bağlama noktası olduğunda.
kaszynek

3
Bu gerçekten en iyi cevap ve sorunun kalbine geliyor ..
Stephen

7
Bu var setoptbaşka vaka herkes merak ediyor içinde, zsh için.
Pat

25

Rsync kullan:

rsync -rtv source_folder/ destination_folder/


Benim için en iyi seçenek, tüm süreç hakkında daha fazla geri bildirim almak için - ilerleme kullanıyorum.
Edenshaw

5

rsync iyidir, ancak başka bir seçenek:

cp -a src/ dst/

Ana yardımdan:

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

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

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

Ben her zaman cp -r kullandım. Cp -a
Pinaki Mukherjee 'de

4

Kaynak ve hedef dizininiz aynı ada sahipse, hedef dizinde bulunsa bile, şunu yazabilirsiniz:

cp -R /etc/skel /home/

Bu, / etc / skel dizinini gizli dosyalar ve dizinler dahil / home / dizinine kopyalayacaktır.

Sonunda dizini kopyalayabilir ve tek bir satırda yeniden adlandırabilirsiniz:

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

Ya da sadece cp -r /etc/skel /home/useryeniden adlandırma skelyapmak için kullanabilirsiniz user...
David

Bu doğru, ancak / home / user henüz mevcut değilse.
Gabriel Hautclocq 14:13

4

Rsync kullanabilirsiniz.

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

Hatta ssh üzerinden kopyalayabilirsiniz

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

Kullanabileceğiniz çeşitli bayraklar var: -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.

Rsync man sayfası


4

En basit yol:

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

İfade {.,}*, tüm dosyaları ve dizinleri içerir (ayrıca bir nokta ile başlar).

Yukarıdaki ifadeyi kullanmak istemiyorsanız, cpbir hedef klasör için birden fazla kaynak belirtme olan özelliği kullanabilirsiniz:

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

1
Bu gibi dosyaları arayacağı ..anythingya ...anythingvb - stackoverflow.com/a/31438355/2351568 Bu sorunun doğru regex içerir. || ama yine de kullanmak shopt -s dotglobhala daha iyi bir çözüm!
DJCrashdummy

@DJCrashdummy ne yazık ki, neden dikkatinizi yazdığınızı anlamıyorum. Sonuçta benim çözümüm, yazdığınız davaları dikkate alır. Saygılar
simhumileco 6:30 '

üzgünüm yanlış metin! - Cevabınızla ilgili problem, aynı zamanda dikkate alacağı .ve ..(mevcut ve içerdiği klasöre eşdeğer olan) olmasıdır. || ama yine de linkteki cevap daha da açıklar ve bir çözüm sunar.
DJCrashdummy

2

Orada bir komut satırı hiledir (en azından, içinde çalıştığını unutmayın sh , bash ve ksh ): Sadece soneki gelen bir çizgi ile ve dizine. Bu içeriğini dökeceğim dan içine dizine için dizine (zaman ironik, ben ilk bu hüner hakkında öğrendiği kullanarak rsync ).

Örnek:

/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

Buraya Googled'i aynı soruna bir çözüm bulmak için geldim, sonra bulmanın kolay olduğunu anladım. Avantaj, kabuğa veya kurulmamış özel uygulamalara bağlı değildir.

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

Püf noktası sondaki eğik çizgiyle denedim, ama bu benim için işe yaramadı.


2

Tüm dosyaları ( .dosyalar dahil ) izinleri koruyan bir hedef dizine kopyalamak zorunda kaldığımda bu problemin çözümü : (zaten varsa üzerine yaz)

yes | cp -rvp /source/directory /destination/directory/

yesHedef dosyalarının otomatik olarak üzerine yazılması, rözyinelemeli, vayrıntılı, pizinlerin saklanması .

Kaynak yolun bir/ bitmediğine dikkat edin (bu nedenle tüm dosyalar / dizin ve. Dosyalar kopyalanır)

Hedef/ klasör, kaynak klasörün içeriğini bir bütün olarak hedefe koyarken sona erer .


1

Cp'nin her zaman gizli dosyaları kopyalamadığını ve tüm linux / unix lehçelerinde çalışıyor gibi görünen bir komut istiyorsanız, kullanmayı denemelisiniz:

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

-2

En azından K3b 2.0.3'ten itibaren, dizine projeye eklendiğinde açılan, gizli dosyaları eklemek isteyip istemediğinizi soran bir soru kutusu var ... bağlantıları. Güzel iş!


"açılan bir soru kutusu" - bir kabuk (CLI) komutu için mi?
Scott,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.