scp senza sostituire i file esistenti nella destinazione


158

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)


Sì, è fastidioso quando un utile programma / utility non ha quell'opzione "se solo potesse ..."! In questo caso "--noclobber"!
MikeW,

Risposte:


140

Utilizzare rsynce passare -use si desidera aggiornare solo i file più recenti nella directory originale o --ignore-existingsaltare tutti i file già esistenti nella destinazione.

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

(Nota /sul lato sorgente: senza di essa rsynccreerebbe /remote/directory/directory.)


@Anthon Non capisco il tuo commento e non vedo una risposta o un commento di Chandra. --ignore-existingaggiunge senza sostituire, quale perdita di dati vedi?
Gilles,

Siamo spiacenti, ho solo guardato il tuo primo esempio in cui puoi avere la perdita di dati (e IMHO non è ciò che l'OP ha richiesto), se includi --ignore-perdita di dati esistente non dovrebbe accadere.
Anthon,

Questo non aiuta se il sistema remoto non è rsyncfacilmente disponibile .... (Come Win32-OpenSSH)
Gert van den Berg

@GertvandenBerg rsync è abbastanza facile da installare su Windows, non più difficile di SSH.
Gilles,

@Gilles: Vero, ma tutte le opzioni sembrano coinvolgere le DLL di Cygwin ... (Lo stato attuale della porta MS di OpenSSH è tale che abilitare la compressione su scp è sufficiente per interrompere SCP ...) (Ottenere rsync funzionale su Win32 -OpenSSH sembra anche non banale - si spera che migliori nel tempo) (Solaris 10 è l'altro esempio, in cui --rsync-pathè necessario un pacchetto di terze parti )
Gert van den Berg

82

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

In altre parole: puoi fare in scpmodo che i file vengano saltati in modo efficace rimuovendo temporaneamente le autorizzazioni di scrittura (se sei il proprietario dei file).


5
Grazie per questo. Era esattamente il trucco che stavo cercando.
saccarina,

assicurati di copiare nuovamente i file e aggiungi un * per farlo. Esempioscp -r user@server.com:/location/of/files/* /local/location/
Rick,

1
trova . -type f -exec chown root: root {} \;
ling

1
Nel caso non comune che solo alcuni dei file nella directory vengano sovrascritti (se non "protetti") e che le autorizzazioni dei file non sono uniformi tra i file, questa soluzione potrebbe non funzionare. Altrimenti, è abbastanza semplice ed efficace.
sancho.s,

Per fare ciò su Windows selezionare tutti i file, fare clic con il tasto destro -> proprietà -> sola lettura
BenJammin

12

È possibile copiare solo i nuovi file per data. Usofind

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

cosa significa +7?
Francis Kim,

@FrancisKim significa modificato 7 giorni fa. Quindi questa query seleziona tutti i file * .gz modificati negli ultimi 7 giorni
Vadim Eremeev,

4
Il +7 non implica in realtà più di 7 giorni fa?
Jeff H.

1
Sì, significa "più di 7 giorni fa". Non ho idea di chi abbia votato a favore.
Stefan Reich,

9

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 cambiarli successivamente ( chmod +wper 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).


2
Non capisco: come rsync --ignore-existinghai fatto a perdere i dati?
Gilles,

4
Ho ottenuto l'errore find: missing argument to '-exec'con questo comando, e invece ha dovuto usare: find . -type f -exec chmod a-w {} \;. Il mio Linux è cattivo, ymmv.
wpearse,

Questa è una risposta migliore e più sicura. Il comando corretto per modificare l'autorizzazione è come menzionato da @wpearse:find . -type f -exec chmod a-w {} \;
Amir,

6

Ho avuto un compito simile, nel mio caso non ho potuto usare rsync, csynco FUSE perché il mio stoccaggio ha solo SFTP. rsyncnon è stato possibile modificare la data e l'ora per il file, alcune altre utilità (come csync) mi hanno mostrato altri errori: " Impossibile creare il file temporaneo Skew rilevato ".

Se hai accesso al server di archiviazione, installa openssh-servero avvia rsynccome demone qui.

Nel mio caso - non potevo farlo e la soluzione era: lftp . lftpL'uso 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.

Puoi trovare le pagine man tramite il link: http://lftp.yar.ru/lftp-man.html


6

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>' 

1
Effettua una connessione remota. Prima di tutto è la fonte, la collega alla connessione SSH e la decomprime sul sistema remoto.
huembi,

-1

scpsovrascrive i file e non c'è alcun interruttore per impedirlo, ma puoi copiare le cose a modo tuo, fare lo scp e quindi copiare nuovamente 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 user@server:dir/* ./
    
  3. Copia i file originali su tutto ciò che scp ha scritto:

    cp -r original_files/* ./
    

3
Questo metodo non aiuta quando si tenta di estrarre i file da un telecomando e riprendere da dove si era interrotto. Vale a dire se lo scopo è quello di risparmiare tempo.
Oliver Williams,

-1

Un altro modo per ottenere questo è quello di fare un lsnella cartella di destinazione:

Nella cartella di destinazione remota:

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

Sulla fonte:

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

A destinazione:

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

Per favore, non farlo. 1. Non analizzare ls . 2. La risposta è pericolosa se qualsiasi nome file contiene - >spazio newline o altri caratteri speciali. 3. Hard-code a for-loop in uno script Python. Generare un programma in fase di esecuzione è difficile e complicato (anche se fatto da programmatori professionisti), per molte ragioni. Generare uno script di shell è anche peggio: un'idea terribile.
ignis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.