Linux nasıl kopyalanır ama üzerine yazılmaz?


Yanıtlar:


589

Alındığı adam sayfası :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

Misal:

cp -n myoldfile.txt mycopiedfile.txt

32
Not, dosya varsa bu bir hata ile çıkacaktır. Başarıyla çıkmak için deneyin cp -n source.txt destination.txt || true
galenandrew

13
Ubuntu 12.04'te cp -ndosya varsa @galenandrew hatayla çıkmaz.
amit

@galenandrew Onaylandı. Teşekkür ederim. Projem, hedefime bir çalıştırma komut dosyası ekledikten sonra Xcode'da oluşturulmuyordu.
Ruiz

@AaronFranke öyle görünüyor.
Boris

93

Kullanmayı düşünün rsync.

rsync -a -v --ignore-existing src dst

Yorumlara göre rsync -a -v src dstdoğru değil çünkü mevcut dosyaları güncelleyecektir.


7
--ignore-existingMevcut dosyaların üzerine yazılmasını önlemek için bayrağı eklemek istiyorsunuz .
Tüm İşçiler

7
Tam komut rsync -a -v --ignore-existing <src> <dst>aslında cp -uyukarıdakiler yerine doğru cevaptır .
Whitebird

Önceki bir kopya kesildiyse ve yalnızca kesilmiş bir dosya kopyalandıysa, eminim cp -u yeniden kopyalamaz ... ama --ignore-available ile rsync? Muhtemelen her ikisi de ... bu yüzden onları mükemmel bir şekilde eşdeğer yapar, değil mi?
dagelf

rsync dosyayı zaman damgasını tutarken cp geçerli saati kullanıyor (deneyimime göre)
Stefan Diabo

1
bazı sunucular sadece rsync yok
mebada

51
cp -n

İstediğin bu. Kılavuz sayfasına bakınız.


@AaronFranke evet, özyineli olarak çalışacaktır.
Boris

33

Bu RedHat üzerinde çalışacaktır:

false | cp -i source destination 2>/dev/null

Güncellemek ve üzerine yazmamak farklı bir şeydir.


4
falseBurada ne yapar ?
Donmuş Alev

11
@FrozenFlame Soruları -iyanıtlar.
ceving

Açıkçası, ARG_MAX dosyalarından daha fazlasını kopyalamaya çalışırsanız bu komut çalışmaz. Bu sorunu çözmek için bu bağlantıyı kontrol edin .
mginius

2
Ayrıca, açık bir şekilde, dünya güneşe çarptığında bu komut çalışmaz.
ceving

32

Bir 'n' seçeneği olmadığını (RedHat'taki gibi) bulamayan kullanıcılar cp -uiçin, dosyayı yalnızca kaynak mevcut olandan daha yeni olduğunda (veya mevcut bir dosya yoksa) yazmak için kullanabilirsiniz .

Yorumlarda belirtildiği gibi, bu eski dosyaların üzerine yazacaktır, bu yüzden OP'nin tam olarak istediği şey değildir. Bunun için ceving'in cevabını kullan.


11
OP , kopyalanan dosyalardan daha eski olsalar bile mevcut dosyaların üzerine yazmamasını istedi , bu yüzden -uaslında amaca uygun değil.
Andrew Lott

4
İyilik, kesinlikle haklısın. Herkesin fark etmesi çok uzun sürdü.
Grim ...

OP'nin istediği şey olmayabilir, ancak tam olarak Uberspace (Centos 7) için ihtiyacım olan şeydi. Teşekkürler!
Thomas Praxl

Altı yıl önce yardımcı olabildiğime sevindim :-D
Grim ...

10

Alpine linux: Aşağıdaki cevap sadece tek bir dosya içindir: alpin cp -nçalışmıyor (ve false | cp -i ...çok) bu yüzden benim durumumda çalışan çözüm buldum:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

Yukarıdaki örnekte eğer env.jsdosya daha sonra anlaşıldı Varlığından değil env.example.jsetmek env.js.


1

Cp'nin bazı sürümlerinde --no-clobber seçeneği yoktur. Bu durumda:

  echo n | cp -vipr src/* dst
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.