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.