2014-05-16 24 views
43

Varolan bir dizinin üzerine yazacak bir Bash komut dosyası yazmaya çalışıyorum. Yani, bir dizin foo/ve ben onun üzerine/üzerine yazmaya çalışıyorum. Ancak, ne olur?İçinde başka bir tane oluşturmak yerine dizinin üzerine yazmak için 'cp' nasıl zorlanır?

Ne olursa, yeni bir bar/foo/dizininin oluşturulmasıdır. Bunu istemiyorum. Foo/a ve b'de iki dosya vardır. Barda da aynı isimde dosyalar var. Foo/a ve foo/b'nin bar/a ve bar/b ile değiştirilmesini istiyorum.

cevap

5

bunu kullanın cp komut:

cp -Rf foo/* bar/ 
+4

Bu, çubukta bulunan ancak foo'da bulunmayan dosyaları kaldırmaz. – Ara

+1

Bununla ne demek istediğini bilmiyorum. Neden cp' komutu dosyayı kaynaktan kaldırmalı? – anubhava

+0

Anladığım kadarıyla, eğer var olan bir dizinin üzerine yazdığınız zaman, başka bir dizinin üzerine yazılırken, üzerine yazılan dizinin diğerinin kopyası olmalıdır. I.e. son barda @ jonathan-wheeler cevapta olduğu gibi foo'nun bir kopyası olmalı, ancak bir dosya çubuğu/c ve hiçbir foo/c olsaydı, bar/c silinmez. Bir yan notta, Saurabh Meshram'ın yanıtında da öyle olmadığını fark ettim. – Ara

19

iki adımda yap.

rm -r bar/ 
cp -r foo/ bar/ 
+0

Bu onun tek bir komutta olmasını istediğini düşünüyor, ama bu iyi görünüyor. –

+7

Bu aslında, ** bar ** 'foo' içeriğine özdeş olmasını sağlamak için şimdiye kadar verilen ** sadece ** örnek, 'foo' öğelerinin bir bileşimi değil, 'çubuğunda zaten var olan diğer öğelerin birleşimi '. Aşağıdaki @Saurabh Meshram gelen son derece cevablı cevap bu soruna sahiptir. – robo

+1

Bunu kullanarak daha dikkatli olun, çünkü * tüm dosyaları bardan, hatta gizli olanlardan kaldırır. –

52

Sen cp bu kullanarak -T seçeneği yapabilirsiniz.
cp için Man sayfasına bakın.

-T, --no-target-directory 
    treat DEST as a normal file 

Örneğinize göre, dosya yapısı aşağıdadır. verbose'e için -v kullandığınızda

$ tree test 
test 
|-- bar 
| |-- a 
| `-- b 
`-- foo 
    |-- a 
    `-- b 
2 directories, 4 files 

Sen net farkı görebilirsiniz.
Sadece -R seçeneğini kullandığınızda. seçeneğini -T kullandığınızda

$ cp -Rv foo/ bar/ 
`foo/' -> `bar/foo' 
`foo/b' -> `bar/foo/b' 
`foo/a' -> `bar/foo/a' 
$ tree 
|-- bar 
| |-- a 
| |-- b 
| `-- foo 
|  |-- a 
|  `-- b 
`-- foo 
    |-- a 
    `-- b 
3 directories, 6 files 

normal bir dosyada değil dizin gibi hedef tedavi , içeriğini üzerine yazar.

$ cp -TRv foo/ bar/ `foo/b' -> `bar/b' `foo/a' -> `bar/a' $ tree |-- bar | |-- a | `-- b `-- foo |-- a `-- b 2 directories, 4 files 

Bu, sorununuzu çözmelidir.

+9

, sadece herkes tarafından bu kadar tetiklendiğinde OSX cp ile çalışmaz https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages /man1/cp.1.html – dnfehren

+5

Yukarıda verilen örneklerin problemi maskelemesine rağmen, bu cevabın OP'nin ne aradığı açık değildir. -T seçeneği ile, mevcut bir hedefte bulunan dosyalar (bar Kaynakta ('foo /') '' * * * * bırakılmayacak, bu yüzden çoğu insan dizinin tam üzerine yazmayı düşünmez. . Eğer bar/baz 'zaten mevcutsa, o zaman hala var olacaktı ... – robo

+0

İşlemdeki hedef klasörü temizleme seçeneği yok mu? Buna inanamıyorum! – JohnyTex

3

Aşağıdaki komut dotfiles (gizli dosyalar) kopya dahil edilmesini sağlar:

$ cp -Rf foo/. bar 
+1

Bu doğru mu? Olağandışı görünüyor. – Mateng

+2

@Mateng Sadece test ettim - evet bu doğru. – Matmarbon

1

@Jonathan Wheeler çok benzer: hatırlamak istemiyor, ama bar yeniden yoksa

:

rm -r bar/ 
cp -r foo/ !$ 

!$ görüntüler önceki komuta son argüman.

+1

! $ Ile ilgili ipucu harika! –