Odpowiedzi:
Zrobione ze strony człowieka :
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
Przykład:
cp -n myoldfile.txt mycopiedfile.txt
cp -n source.txt destination.txt || true
cp -n
nie wychodzi z błędem, jeśli plik istnieje w systemie Ubuntu 12.04.
Rozważ użycie rsync
.
rsync -a -v --ignore-existing src dst
Zgodnie z komentarzami rsync -a -v src dst
nie jest poprawny, ponieważ zaktualizuje istniejące pliki.
--ignore-existing
flagę, aby zapobiec zastąpieniu istniejących plików.
rsync -a -v --ignore-existing <src> <dst>
jest rzeczywiście poprawną odpowiedzią zamiast cp -u
powyższej.
Działa to w RedHat:
false | cp -i source destination 2>/dev/null
Aktualizacja i nie nadpisywanie to coś innego.
false
tu robi?
-i
pytania.
W przypadku osób, które nie mają opcji „n” (jak ja w RedHat), możesz użyć cp -u
do zapisania pliku tylko wtedy, gdy źródło jest nowsze niż istniejące (lub nie istnieje).
[edytuj] Jak wspomniano w komentarzach, spowoduje to zastąpienie starszych plików, więc nie jest to dokładnie to, czego chciał OP. Użyj do tego odpowiedzi Cevinga.
-u
naprawdę nie pasuje do celu.
Alpine linux: Poniższa odpowiedź dotyczy tylko jednego pliku: w alpine cp -n
nie działa (i false | cp -i ...
też), więc rozwiązanie działające w moim przypadku, które znalazłem to:
if [ ! -f env.js ]; then cp env.example.js env.js; fi
W powyższym przykładzie, jeśli env.js
plik nie istnieje, kopiujemy env.example.js
do env.js
.