cp
Bir 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?
cp
Bir 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 -n
dosya varsa @galenandrew hatayla çıkmaz.
Kullanmayı düşünün rsync
.
rsync -a -v --ignore-existing src dst
Yorumlara göre rsync -a -v src dst
doğru değil çünkü mevcut dosyaları güncelleyecektir.
--ignore-existing
Mevcut dosyaların üzerine yazılmasını önlemek için bayrağı eklemek istiyorsunuz .
rsync -a -v --ignore-existing <src> <dst>
aslında cp -u
yukarı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.
false
Burada ne yapar ?
-i
yanıtlar.
Bir 'n' seçeneği olmadığını (RedHat'taki gibi) bulamayan kullanıcılar cp -u
iç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.
-u
aslı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.js
dosya daha sonra anlaşıldı Varlığından değil env.example.js
etmek env.js
.