'Cp' komutunu kullanarak dizin içeriğini kopyalayın


33

Bir dizinin tüm içeriğini bir başkasına nasıl kopyalarsınız?

Örneğin:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

Yukarıdaki problem, '*' küre şeklinin gizli dizinlerle eşleşmesidir. ' ve '..' ve içerik olarak 'newuser' içinde 'olduser' dizini oluşturursunuz.

Bunun gibi bir şey de yapabilirsiniz:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

Peki ya yeni kullanıcı zaten bazı varsayılan dosyalar ve dizinler içeriyorsa?

Sadece basit 'cp' komutunu ve kabuğu kullanarak bir dizinin içeriğini bir başkasına taşımak için en basit, en doğru, en kolay ve en karmaşık olan nedir?

Yanıtlar:


31

Deneyin:

cp -ra /backup/olduser/. /home/newuser

Bu harika, ama tam olarak nasıl çalıştığını çözemiyorum. Galiba bunun nedeni .ve ..çalışmasını anlamadığım için . Açıklamak ister misin?
bradley.ayers

Bu benim için çalıştı ama cp -r ./a byapmadı. Neden bir fikrin var mı?
Brig

3
benim için de çalışır, ancak rseçenek gerekli değildir. aSeçeneğini ima r.
MountainX

1
-r parametresi bu noktada biraz gereksiz görünüyor!
Kutlama Efendisi

-aParametre bu durumda yardıma hiçbir şey yapmaz. Komut cp -r ./a/. bdizinin içeriğini ve sadece içeriğini kopyalar adizine b. -aSorusuna alakalı değil bayrak korur bağlantıları, zaman damgaları vb.
Steen Schütt

23

İki dizin a ve b.

İkisinde de dosya var.

A ve b'yi içeren bir dizindesiniz.

cp -r ./a b

-r = özyinelemeli.


-Bütün dosyaları almak istemiyor musun?
bw

7
-A argümanı tüm dosyalarla hiçbir ilgisi yoktur, arşivleme için kısadır, dosya sahipliğini, izinleri, erişim zamanlarını vb. Koruyacaktır. sağlama.
theotherrece'yi

1
@mch: Eğer söyledim çünkü otomatik olarak dahil cpbir dizin kopyalamak için a, ve a/.somedotfileiçerdiği edilir a. eğer bvarsa, bu komut tam bir kopyasını yaratacak ade b/a.
quix quixote

2
Kolay yol:cp -R /some/dir/* /another/dir
n0pe 04:11

1
Bu, a / foo'yu b / foo yerine b / a / foo'ya kopyalar
Sparr

19

Varsayılan olarak, unutmayın, cpkopyalar ilk dizin içine ikinci dizinde ikinci varsa.

Örneğin cp -r a bkopyalar dizini a içine b. Eğer byoksa, içeriği ile birlikte oluşturulacaktır a.

Kopyalamak istediğiniz takdirde içeriği arasında aiçine bkullanım (örneğin bir bağlama noktası haline bir bütün dosya sistemi kopyalama yaparken):

cp -r a/. b

önceki cevapta olduğu gibi.

Lütfen -a, diğer cevapların bazılarında kullanılanların -dr --preserve=allzaman damgalarını, bağlamı ve genişletilmiş öznitelikleriyle aynı olduğunu ve koruyacağını da unutmayın .


/.İşler nasıl ?
bradley.ayers

a/.'a' dizininin içeriğini, dizinin kendisinin aksine temsil eder, çoğu durumda eşanlamlıdır ancak kullanırken cp -r, cp varsayılan davranışını engeller (bir INTO b kopyalamak).
Nicolas Bonnefon

müthiş bir ipucu, bu tam olarak aradığım şeydi ama başka bir yerde bulamadı - köşe vakalarında başarısız olan 'foo / *' veya '-r foo /'.
Tener

@TimoHuovinen '.' hiç bir joker değil. Kelimenin tam anlamıyla "ebeveyn" dizinidir ve '..' büyük ebeveyn. Bu, '/foo/./././././' anlamına gelir. '/ foo' ile aynı klasördür ve '/ foo / bar / ..' '/ foo' ile aynı klasördür. Bunları dosya sistemine yerleşik olan bağlantılar olarak düşünün.
Quuxman

@quuxman teşekkür ederim, o zamanlar farkında değildim. İnsanların kafasını karıştırmamak için eski yorumumu kaldıracağım.
Timo Huovinen

6

Kabuğunuzu ciddi şekilde yeniden yapılandırmadıysanız, '*' globbing modeli '' ile eşleşmiyor. veya '..', sadece echo * kullanarak doğrulayabildiğiniz gibi. Bunun yerine yaptığı şey, adı '.' İle başlayan dosyaları atlamaktır, bu nedenle yaklaşımınız tüm gizli dosyaları kaçıracaktır. Bu davranışın bazılarını kabuk seçenekleriyle, örneğin bash'daki dotglob seçeneği ile değiştirebilirsiniz, ancak o zaman aradığınız taşınabilir ve sağlam seçenek olmaz.

Bunu bir veya iki defadan fazla yapmanız gerekiyorsa, özenle hazırlanmış kaynak ve hedef özellikleriyle rsync veya unison (belirli ihtiyaçlara bağlı olarak) aramanızı öneririm.

Başka bir alternatif ise kaynak dizinini bir tarball'a koymak ve mevcut hedef dizini üzerinden açmaktır.


1
Bunu kullanıyorum: ( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )... tar cf - .tar 'nın kaynak dizini, dotfiles dahil ve onu STDIN' a aktarılan STDOUT a tükürür tar xf -.
quix quixote

OP'nin asıl amacının '.' İle başlayan dosyalara nasıl başvuruda bulunacağını düşünüyorum. ama özel ' değil . ve '..' dizinleri. Rsync veya başka bir karmaşık program kullanmak yerine yukarıda çok daha zarif bir çözüm var.
Quuxman

2

Bu, ana dizini ( ..) hariç tutarken hem normal hem de gizli dosyaları kopyalar :

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

Üst dizini hariç tutmazsanız, ..hedef dizininizdeki tüm içeriğe sahip olursunuz.


1
Ancak, bu hala başlayan isimleri içermez ..(örneğin ...veya ..super-hidden).
Scott

0

Nokta ile başlayan dosyaları kopyalamak için sadece cp yapın. * Target /

Bu yüzden en kolay olanı sadece cp komutunu iki kere yapmak.

Peter Eisentraut sais'in normal globbing kurallarını içermesi gibi .. ve. (hm, bu cümleyi nasıl bitirebilirim?;)

Özyinelemeli yapmak için -r, cp'yi bir dosyanın üzerine yazmak isteyip istemediğinizi sormak için -i kullanın.

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/

Genellikle *eşleşmez .ya da ..kullanırsanız kullanır .*. Dene echo .*. Sen hariç tutabilirsiniz .ve ..aşağıdaki desenli: .[^.]*.
mch

@mch: Ama .[^.]*yine de ile başlayan isimleri hariç tutar ..(örn . ...veya ..super-hidden).
Scott

0

Bu, gizli dizinler dışındaki tüm dosyaları ve dizinleri geçerli dizinden tekrar tekrar nereye kopyalamak için çalışır:

cp -rf * ^.* 
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.