it-swarm.it

scp senza sostituire i file esistenti nella destinazione

Come copio un'intera directory in una directory con lo stesso nome senza sostituire il contenuto nella directory di destinazione? (invece, vorrei aggiungere al contenuto della cartella di destinazione)

169
biznez

Usa rsync e passa -u se desideri aggiornare solo i file più recenti nella directory originale o --ignore-existing per saltare tutti i file già esistenti nella destinazione.

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

(Notare la / sul lato sorgente: senza di essa rsync creerebbe /remote/directory/directory.)

scp sovrascriverà i file se si dispone dei permessi di scrittura.

In altre parole: puoi fare in modo che scp salti effettivamente detti file rimuovendo temporaneamente le autorizzazioni di scrittura su di essi (se sei il proprietario dei file, cioè).

88
Reimund

Puoi copiare solo i nuovi file per data. Usa find

scp  `find /data/*.gz -type f -mtime +7` [email protected]:/backup/
12
Naks

Se è possibile rendere il contenuto del file di destinazione di sola lettura:

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

prima di eseguire scp (si lamenterà e salterà i file esistenti).

E poi cambiali nuovamente (chmod +w per ottenere il valore basato su umask). Se i file non hanno tutti i permessi di scrittura in base alla tua umask, dovresti in qualche modo archiviare i permessi per poterli ripristinare.

(La risposta di Gilles sovrascrive i file esistenti se localmente sono più recenti, in questo modo ho perso dati preziosi. Non capisco perché quella risposta sbagliata e dannosa abbia così tanti voti positivi).

10
Mohad

Per copiare un sacco di file, è più veloce tararli. Usando -k si impedisce anche a tar di sovrascrivere i file quando si scompatta il pacchetto sul sistema di destinazione.

tar -c <source-dir> | ssh <name>@<Host> 'tar -kxzf - -C <target-dir>' 
7
huembi

Avevo un compito simile, nel mio caso non potevo usare rsync, csync o Fuse perché il mio archivio ha solo SFTP. rsync non è stato in grado di modificare la data e l'ora per il file, alcune altre utilità (come csync) mi hanno mostrato altri errori: " Impossibile creare il file temporaneo Inclinazione dell'orologio rilevata".

Se hai accesso al server di archiviazione, installa openssh-server o avvia rsync come demone qui.

Nel mio caso, non ho potuto farlo e la soluzione era: lftp . L'utilizzo di lftp per la sincronizzazione è inferiore:

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

/src/folder - è la cartella sul mio PC, /rem/folder - è sftp://sft.domain.tld/rem/folder.

È possibile trovare pagine man tramite il collegamento: http://lftp.yar.ru/lftp-man.html

6
bolD

scp sovrascrive i file e non c'è alcun interruttore per impedirlo, ma puoi copiare le cose a modo tuo, fare lo scp e quindi copiare i file esistenti. Esempi:

  1. Copia tutti i file esistenti fuori strada

    mkdir original_files ; cp -r * original_files/
    
  2. Copia tutto usando scp

    scp -r [email protected]:dir/* ./
    
  3. Copia i file originali su tutto ciò che scp ha scritto:

    cp -r original_files/* ./
    
0
A.Badger