cpBir dizine istiyorum ama kopyalanan dosyalardan daha eski olsalar bile varolan dosyaların üzerine yazmak istemiyorum. Ve bu tamamen Cractab Bash betiğinin bir parçası olacağı için tamamen etkileşimsiz yapmak istiyorum. Herhangi bir fikir?
cpBir dizine istiyorum ama kopyalanan dosyalardan daha eski olsalar bile varolan dosyaların üzerine yazmak istemiyorum. Ve bu tamamen Cractab Bash betiğinin bir parçası olacağı için tamamen etkileşimsiz yapmak istiyorum. Herhangi bir fikir?
Yanıtlar:
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
cp -n source.txt destination.txt || true
cp -ndosya varsa @galenandrew hatayla çıkmaz.
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.
--ignore-existingMevcut dosyaların üzerine yazılmasını önlemek için bayrağı eklemek istiyorsunuz .
rsync -a -v --ignore-existing <src> <dst>aslında cp -uyukarıdakiler yerine doğru cevaptır .
Bu RedHat üzerinde çalışacaktır:
false | cp -i source destination 2>/dev/null
Güncellemek ve üzerine yazmamak farklı bir şeydir.
falseBurada ne yapar ?
-iyanıtlar.
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.
-uaslında amaca uygun değil.
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.