Chcę cpkatalogu, ale nie chcę zastępować żadnych istniejących plików, nawet jeśli są one starsze niż skopiowane pliki. Chcę to zrobić całkowicie nieinteraktywnie, ponieważ będzie to część skryptu Crontab Bash. Jakieś pomysły?
Chcesz dodać --ignore-existingflagę, aby zapobiec zastąpieniu istniejących plików.
Wszyscy pracownicy są niezbędni
7
Kompletne polecenie rsync -a -v --ignore-existing <src> <dst>jest rzeczywiście poprawną odpowiedzią zamiast cp -upowyższej.
Whitebird
Jeśli poprzednia kopia została przerwana i skopiowany został tylko obcięty plik, jestem pewien, że cp -u nie skopiuje go ponownie ... ale uruchomi rsync z opcją --ignore-exist? Prawdopodobnie też nie ... dzięki czemu są idealnie równoważne, prawda?
dagelf
rsync zachowuje sygnaturę czasową pliku, podczas gdy cp wykorzystuje aktualny czas (z mojego doświadczenia)
Oczywiście to polecenie nie będzie działać, jeśli spróbujesz skopiować więcej niż pliki ARG_MAX. Aby obejść ten przypadek, sprawdź ten link .
mginius
2
Oczywiście, to polecenie nie zadziała, jeśli ziemia uderzy w słońce.
Ceving
32
W przypadku osób, które nie mają opcji „n” (jak ja w RedHat), możesz użyć cp -udo 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.
OP poprosił, aby nie zastępować istniejących plików, nawet jeśli są one starsze niż skopiowane pliki , więc tak -unaprawdę nie pasuje do celu.
Andrew Lott,
4
Boże, masz absolutną rację. Dziwi mnie, że tak długo zajęło to zauważenie.
Ponury ...
Być może nie o to poprosił OP, ale właśnie tego potrzebowałem do mojej Uberspace (Centos 7). Dzięki!
Thomas Praxl,
Cieszę się, że sześć lat temu mogłem pomóc :-D
Ponury ...
10
Alpine linux: Poniższa odpowiedź dotyczy tylko jednego pliku: w alpine cp -nnie 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.jsplik nie istnieje, kopiujemy env.example.jsdo env.js.
Odpowiedzi:
Zrobione ze strony człowieka :
Przykład:
źródło
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
.Zgodnie z komentarzami
rsync -a -v src dst
nie jest poprawny, ponieważ zaktualizuje istniejące pliki.źródło
--ignore-existing
flagę, aby zapobiec zastąpieniu istniejących plików.rsync -a -v --ignore-existing <src> <dst>
jest rzeczywiście poprawną odpowiedzią zamiastcp -u
powyższej.To jest to czego chcesz. Zobacz stronę manuala.
źródło
Działa to w RedHat:
Aktualizacja i nie nadpisywanie to coś innego.
źródło
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.
źródło
-u
naprawdę nie pasuje do celu.Alpine linux: Poniższa odpowiedź dotyczy tylko jednego pliku: w alpine
cp -n
nie działa (ifalse | cp -i ...
też), więc rozwiązanie działające w moim przypadku, które znalazłem to:W powyższym przykładzie, jeśli
env.js
plik nie istnieje, kopiujemyenv.example.js
doenv.js
.źródło
Niektóre wersje cp nie mają opcji --no-clobber . W tym wypadku:
źródło