Skopiuj pliki w systemie Linux, unikaj kopiowania, jeśli pliki istnieją w miejscu docelowym

32

Muszę skopiować folder / home / użytkownika z jednego dysku twardego na inny. Ma 100 000 plików i rozmiar około 10G.

używam

cp -r /origin /destination

czasami dostaję błędy z powodu zepsutych linków, uprawnień i tak dalej. Naprawiam więc błąd i muszę zacząć od nowa.

Zastanawiam się, jak mogłem powiedzieć komendę „cp”, gdy spróbuje ponownie skopiować, aby nie kopiować plików, jeśli istnieją w folderze docelowym.

Otwórz drogę
źródło
2
Nie my cp. Zamiast tego użyj rsync.
William Pursell,

Odpowiedzi:

22

cp -R -u -p /source /destination

Flaga -u( lub--update ) właśnie to robi:

Ze strony podręcznika użytkownika dla cp:

-u, --aktualizacja

kopiuj tylko wtedy, gdy plik SOURCE jest nowszy niż plik docelowy lub gdy brakuje pliku docelowego

użytkownik31894
źródło
6
Aby dosłownie kopiować tylko te pliki, które nie istnieją i nie aktualizować istniejących, yes n | cp -i /source/* /destination 2>/dev/null
sventechie
4
-u, --aktualizuj kopię tylko wtedy, gdy plik SOURCE jest nowszy niż plik docelowy lub gdy brakuje pliku docelowego -u, --uaktualnij kopię tylko wtedy, gdy plik SOURCE jest nowszy niż plik docelowy lub gdy brakuje pliku docelowego -p taki sam jak --preserve = tryb, własność, znaczniki czasu --preserve [= ATTR_LIST] zachowaj określone atrybuty (domyślnie: tryb, własność, znaczniki czasu), jeśli to możliwe, dodatkowe atrybuty: kontekst, linki, xattr, wszystko
Covich
51

Po prostu użyj cp -n <source> <dest>.

Ze strony podręcznika :

-n, --no-clobber

NIE zastępuj istniejącego pliku (przesłania poprzednią opcję -i)

Balmipour
źródło
7
To jedyna prawdziwa odpowiedź na pytanie.
sebix
20

rsync -aq /src /dest

Oprócz kopiowania tylko nowszych plików, skopiuje nawet nowsze części plików, jeśli plik się zmienił. Jest przeznaczony do kopiowania przez łącza sieciowe, w których chcesz zminimalizować ilość danych - ale działa również świetnie lokalnie.

Martin Beckett
źródło
Nie mogę dodać `` formatowania do twojego postu, ponieważ to tylko dwa znaki. Co sądzisz o edytowaniu tego i dodawaniu znaków do polecenia?
culix 24.04.16
4

Wyszukaj opcję „-u” dla cppolecenia.

Pointy
źródło
2
Nie zgadzaj się, że użycie -u jest dobrym pomysłem. -u kopiuje tylko wtedy, gdy źródło jest nowsze lub brakuje miejsca docelowego. Problem z oryginalnym plakatem został spowodowany zerwaniem kopii pliku z dowolnego powodu. OP miałby zatem w połowie zapisany plik, który nie był aktualizowany podczas ponownego uruchamiania kopii. Ten plik może być dla kogoś ważny! rsync rozwiązuje ten problem.
hazymat
2

Wszystkie powyższe odpowiedzi są poprawne, ale jeśli robisz to rekurencyjnie, to

powinieneś zrobić:

 cp -rn SOURCE_PATH DESTINATION_PATH
grepit
źródło
1

Powinieneś kopiować jako root, aby zachować uprawnienia / własność

# cp -au

Zobacz także rsync

pixelbeat
źródło
1

Rozwiązanie POSIX

Inne odpowiedzi wykorzystują -u lub -nopcje cp. Żadne z nich nie jest wymagane przez POSIX ; ani też nie pochodzi rsyncz innej odpowiedzi; ani nie jest yesużywany w jednym z komentarzy.

Nadal możemy się rozmnażać yes nza pomocą whilepętli. Prowadzi to do następującego rozwiązania POSIX:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null
Kamil Maciorowski
źródło
0

Posługiwać się cp -rn <sourcedirname>/. <destdirname>

Przełącznik r powoduje, że kopiowanie rekurencyjne w katalogach.

Przełącznik n (długa wersja bez blokady) zapewnia, że ​​istniejące pliki nigdy nie zostaną nadpisane.

Znak „ /.po nazwie źródła” gwarantuje, że nie stanie się on podkatalogiem pod nazwą destdir zamiast całej zawartości pierwszego z nich skopiowanego do drugiego.

taatparya
źródło