Dosyaları bir dizinden mevcut bir dizine kopyalama


248

Bash'da bunu yapmam gerekiyor:

  1. bir dizindeki tüm dosyaları al

  2. mevcut bir dizine kopyala

Bunu nasıl yaparım? Denedim cp -r t1 t2(hem t1 hem de t2 mevcut dizinler, t1 içinde dosyalar var) ama t2 içinde t1 adlı bir dizin yarattı, bunu istemiyorum, t1'deki dosyalara doğrudan t2'nin içine girmem gerekiyor. Bunu nasıl yaparım?


11
Bu neden kapatıldı? Bir bash komutunun yerleşik veya harici bir komut olması (örn. Printf çoğu sistemde her ikisinde de var ise) cpisteğe bağlıdır , bu nedenle sorular bashbir programlama dili olan sorular olarak görülebilir . Dosya kopyası hakkında konuşurken bir Python sorusu görmedim.
Ciro Santilli 法轮功 冠状 38 六四 事件 法轮功


Bash kabuk kopyalama komutunun sözdizimi hakkında bir hatırlatma aramaya geldim ve bu komutların Windows kurulumumdaki temel NTFS dosya sistemine karşı da işe yaradığını bildirmekten memnuniyet duyuyorum.
David A. Gray

Yanıtlar:


396

Ne istiyorsun:

cp -R t1/. t2/

Sondaki nokta, dizinin kendisini değil, geçerli dizinin içeriğini kopyalamasını söyler. Bu yöntem aynı zamanda gizli dosya ve klasörleri de içerir.


2
Bu sözdizimini gerçekten seviyorum, ancak bir nedenden dolayı çalışmıyor mv. Nedenini bilen var mı?
Martin von Wittich

2
İnanılmaz. Bu nerede belgeleniyor? POSIX veya uzantı mı?
Ciro Santilli 法轮功 11: 病 六四 事件 法轮功

9
Bir dizini kopyalarsanız, cp bir dizin oluşturur ve tüm dosyaları bu dizine kopyalar. "." Adındaki pretend klasörünü kullanırsanız, bu klasör onu tutan dizinle aynıdır, bu şekilde davranır. Diyelim ki t1 "dosya" adlı bir dosya içeriyor. cp, "cp t1 /./ dosya t2 /./" ile eşdeğer işlemi gerçekleştirecektir. "." Klasörünü kopyalıyor ancak dosyaları t2'nin "." "t2 /./", "t2 /" ile aynı olduğundan "./" klasörünü açar. Teknik olarak, bu POSIX yerleşik davranış anlamına gelir ... ama muhtemelen beklediğiniz gibi değil!
çarpıcı


32
cp dir1/* dir2

Veya dir1 içinde de kopyalamak istediğiniz dizinleriniz varsa

cp -r dir1/* dir2

3
Kabuğunuzun nasıl yapılandırıldığına bağlı olarak, gizli dosyaları da yakalamak istiyorsanız, büyük olasılıkla "dir1 / *" yerine "dir1 / * dir1 /.*" kullanmanız gerekir.
ssokolow

2
Kopyalama dir1/.*iyi bir fikir değildir, çünkü dir1 / .. (yani gerçekten kopyalamaya çalıştığınız dizinin üstü) kopyalanır. Ayrıca dir1 / kopyalar. ki bu zaten iyidir (çoğunlukla) kopyalanmıştır, bu yüzden işi iki kez yapıyorsunuz.
Gordon Davisson

1
dir1/.*Kopyalamak istediğiniz dizine cd-ing yazıp / sonra bu dosyaya başvurarak / hidden files sorununu çözebilirsiniz .. Bu nedenle, gizli dosyalar dahil tüm dosyaları bir dizindeki mevcut bir dizine kopyalamak isterseniz, şunları yapabilirsiniz: cd [source dir], cp . [path to destination dir, with no trailing slash].
Rob

8

T1'in içinde dosyalar bulunan klasör ve t2'nin boş dizin olduğu varsayılır. Ne istiyorsun böyle bir şey:

sudo cp -R t1/* t2/

Unutmayın, ilk örnek için, t1 ve t2'nin tam yollar veya göreli yollar (bulunduğunuz yere göre) olması gerekir. İsterseniz, boş klasöre (t2) gidebilir ve bunu yapabilirsiniz:

sudo cp -R t1/* ./

Veya dosyaları (t1) içeren klasöre gidebilir ve şunları yapabilirsiniz:

sudo cp -R ./* t2/

Not: * işareti (veya joker karakter) tüm dosya ve klasörleri ifade eder. -R bayrağı özyinelemeli (her şeyin içindeki her şey) anlamına gelir.


2
cp -R t1/ t2

Kaynak dizindeki eğik çizgi, anlambilimi biraz değiştirir, bu nedenle içeriği kopyalar, dizinin kendisini kopyalamaz. Ayrıca Bertrand'ın cevabının sahip olduğu globbing ve görünmez dosyalar ile ilgili sorunları da önler (kopyalamak t1/*görünmez dosyaları kaçırır, `t1 / * t1 /.* 'kopyalarını istemediğiniz t1 /. Ve t1 / .. kopyalarını kopyalar).


Çözümünüz en azından kurulumumda çalışmıyor (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (üzgünüm yorumlarda kod biçimi yok, pastebin.com/yszSxV6G adresinde okunabilir sürüm )
zpon

2

Bazı ayrıntılara bağlı olarak, bunun gibi bir şey yapmanız gerekebilir:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... bu temel olarak SRC dizinine dönüşür ve onu hedefe kopyalar, daha sonra başladığınız yere geri döner.

Ek karışıklık göreceli veya mutlak hedefleri ele almaktır.

(Bu, cpkomutun kendisinin ince anlambilimine dayanmaz ... izleyen veya olmayan kaynak özelliklerini nasıl ele aldığı hakkında / ... çünkü bunların GNU cpve ben ötesinde kararlı, taşınabilir ve güvenilir olduğundan emin değilim gelecekte böyle olmaya devam edecekler mi bilmiyorum).


1

Bazı dizinin içinse, bu, tüm içeriği "klasör1" den bazı klasör içindeki yeni klasör "klasör2" ye kopyaladığı için dolu olarak kullanılacaktır.

$ (pwd) geçerli dizin için yol alır.

Klasör1 içindeki tüm içeriği almak için klasör1'den sonra noktaya (.) Dikkat edin.

cp -r $(pwd)/folder1/. $(pwd)/folder2
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.