scp bez zastępowania istniejących plików w miejscu docelowym


158

Jak skopiować cały katalog do katalogu o tej samej nazwie bez zastępowania zawartości katalogu docelowego? (zamiast tego chciałbym dodać do zawartości folderu docelowego)


Tak, denerwujące jest, gdy przydatny program / narzędzie nie ma takiej opcji „gdyby tylko mógł ...”! W tym przypadku „--noclobber”!
MikeW,

Odpowiedzi:


139

Użyj rsynci przekaż, -ujeśli chcesz aktualizować tylko pliki nowsze w oryginalnym katalogu lub --ignore-existingpomijać wszystkie pliki, które już istnieją w miejscu docelowym.

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/

(Zwróć uwagę /na stronę źródłową: bez niej rsyncstworzyłaby /remote/directory/directory.)


@Anthon Nie rozumiem twojego komentarza i nie widzę odpowiedzi ani komentarza od chandra. --ignore-existingdodaje bez zastępowania, jaką widzisz utratę danych?
Gilles

Przepraszam, spojrzałem tylko na twój pierwszy przykład, w którym możesz mieć utratę danych (i nie jest to IMHO, o które poprosił PO), jeśli uwzględnisz - utrata danych istniejąca - nie powinna się zdarzyć.
Anthon

To nie pomaga, jeśli zdalny system nie jest rsyncłatwo dostępny .... (jak Win32-OpenSSH)
Gert van den Berg

@GertvandenBerg rsync jest dość łatwy do zainstalowania w systemie Windows, nie trudniejszy niż SSH.
Gilles

@Gilles: To prawda, ale wszystkie opcje wydają się obejmować biblioteki DLL Cygwin ... (Obecny stan portu MS OpenSSH jest taki, że włączenie kompresji na scp jest wystarczające, aby przerwać SCP ...) (Uzyskanie funkcjonalności rsync w Win32 -OpenSSH również wydaje się nietrywialne - mam nadzieję, że z czasem ulegnie poprawie) (Solaris 10 to inny przykład, w którym --rsync-pathpotrzebny jest pakiet innej firmy )
Gert van den Berg

82

scp nadpisze pliki, jeśli masz do nich uprawnienia do zapisu.

Innymi słowy: Możesz scpskutecznie pominąć wspomniane pliki, tymczasowo usuwając na nich uprawnienia do zapisu (jeśli jesteś właścicielem plików).


5
Dzięki za to. To była właśnie sztuczka, której szukałem.
sacharyna

skopiuj pliki z powrotem, dodaj *, aby to zrobić. Przykładscp -r user@server.com:/location/of/files/* /local/location/
Rick

1
odnaleźć . -type f -exec chown root: root {} \;
ling

1
W rzadkim przypadku, w którym oczekuje się, że tylko niektóre pliki w katalogu zostaną zastąpione (jeśli nie są „chronione”), a uprawnienia do plików nie są jednolite między plikami, to rozwiązanie może nie działać. W przeciwnym razie jest to dość proste i skuteczne.
sancho.s

Aby to zrobić w systemie Windows wybierz wszystkie pliki, kliknij prawym przyciskiem myszy -> właściwości -> tylko do odczytu
BenJammin

12

Możesz skopiować tylko nowe pliki według daty. Posługiwać sięfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

co oznacza +7?
Francis Kim

@FrancisKim oznacza modyfikację 7 dni temu. Tak więc to zapytanie wybiera dowolne pliki * .gz zmodyfikowane w ciągu ostatnich 7 dni
Vadim Eremeev

4
Czy +7 tak naprawdę nie oznacza więcej niż 7 dni temu?
Jeff H.

1
Tak, oznacza to „więcej niż 7 dni temu”. Nie mam pojęcia, kto to głosował.
Stefan Reich,

9

Jeśli możesz ustawić zawartość pliku docelowego tylko do odczytu:

find . -type f -exec chmod a-w '{}' \;

przed uruchomieniem scp(narzeka i pomija istniejące pliki).

I zmień je później ( chmod +waby uzyskać wartość na podstawie umask). Jeśli nie wszystkie pliki mają uprawnienia do zapisu zgodnie z umask, będziesz musiał jakoś przechowywać uprawnienia, aby móc je przywrócić.

(Odpowiedź Gillesa zastępuje istniejące pliki, jeśli lokalnie są one nowsze, w ten sposób straciłem cenne dane. Nie rozumiem, dlaczego ta błędna i szkodliwa odpowiedź ma tak wiele głosów).


2
Nie rozumiem: jak rsync --ignore-existingspowodowałeś utratę danych?
Gilles

4
Dostałem ten błąd find: missing argument to '-exec'przy użyciu tej komendy, a zamiast tego musiał użyć: find . -type f -exec chmod a-w {} \;. Mój Linux jest zły, ymmv.
wpearse

To jest lepsza i bezpieczniejsza odpowiedź. Prawidłowe polecenie zmiany uprawnień jest takie, jak wspomniano @wpearse:find . -type f -exec chmod a-w {} \;
Amir

6

Miałem podobne zadanie, w moim przypadku nie mogłem użyć rsync, csynclub FUSE ponieważ mój przechowywanie ma tylko SFTP. rsyncnie można zmienić daty i godziny pliku, niektóre inne narzędzia (jak csync) pokazały mi inne błędy: „ Nie można utworzyć pliku tymczasowego Wykryto przesunięcie zegara ”.

Jeśli masz dostęp do serwera pamięci - po prostu zainstaluj tutaj openssh-serverlub uruchom rsyncjako demon.

W moim przypadku - nie mogłem tego zrobić, a rozwiązaniem było: lftp . lftpwykorzystanie do synchronizacji jest poniżej:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder- jest folderem na moim komputerze, /rem/folder- jest sftp://sft.domain.tld/rem/folder.

Możesz znaleźć strony man pod linkiem: http://lftp.yar.ru/lftp-man.html


6

Aby skopiować całą wiązkę plików, szybciej je tar. Używając -k zapobiegasz również zastępowaniu plików tar podczas rozpakowywania ich w systemie docelowym.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
Nawiązuje połączenie zdalne. Najpierw jest to źródło, podłącza je do połączenia ssh i rozpakowuje w zdalnym systemie.
huembi

-1

scpnadpisuje pliki i nie ma przełącznika, aby to zrobić, ale możesz skopiować rzeczy po drodze, wykonać scp, a następnie skopiować istniejące pliki z powrotem. Przykłady:

  1. Skopiuj wszystkie istniejące pliki

    mkdir original_files ; cp -r * original_files/
    
  2. Skopiuj wszystko za pomocą scp

    scp -r user@server:dir/* ./
    
  3. Skopiuj oryginalne pliki na cokolwiek, co scp napisał:

    cp -r original_files/* ./
    

3
Ta metoda nie pomaga, gdy próbujesz pobrać pliki z pilota i wybrać miejsce, w którym zostało przerwane. To znaczy, jeśli celem jest zaoszczędzenie czasu.
Oliver Williams,

-1

Innym sposobem na osiągnięcie tego jest wykonanie lsw folderze docelowym:

W zdalnym folderze docelowym:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

U źródła:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

Na miejscu:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

Proszę nie rób tego. 1. Nie analizuj ls . 2. Odpowiedź jest niebezpieczna, jeśli jakakolwiek nazwa pliku zawiera - >spację nowej linii lub inne znaki specjalne. 3. Zakoduj na stałe pętlę for w skrypcie python. Generowanie programu w czasie wykonywania jest trudne i trudne (nawet jeśli jest wykonywane przez profesjonalnych programistów) z wielu powodów. Generowanie skryptu powłoki jest jeszcze gorsze - okropny pomysł.
ignis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.