Come posso salvare i file modificati?


8

Ho due cartelle:

  • ORIGINALE/
  • ORIGINAL_AND_MY_CHANGES /

Il mio amico ha una copia di ORIGINAL /. Vorrei generare MY_CHANGES.tgz - dovrebbe contenere solo file nuovi / modificati da ORIGINAL_AND_MY_CHANGES / rispetto a ORIGINAL /. Quindi il mio amico può decomprimerlo nella sua copia di ORIGINAL / e ottenere ORIGINAL_AND_MY_CHANGES /. Come posso fare questo?

PS Ho provato diffma non è possibile salvare i dati binari e rsync --link-dest- genera collegamenti reali inutili nell'archivio.

PPS Nel mio caso il tempo di modifica non può essere usato per decidere quale file è stato modificato.


1
Hai guardato la directory "diff"? domanda?
rozcietrzewiacz,

Risposte:


7

Con rsync

Quello che stai facendo è essenzialmente un backup incrementale: il tuo amico (il tuo backup) ha già i file originali e vuoi fare un archivio contenente i file che hai cambiato da quell'originale.

Rsync ha funzionalità per backup incrementali.

cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
  • -a significa preservare tutti gli attributi (tempi, proprietà, ecc.).
  • -c significa confrontare i contenuti dei file e non fare affidamento su data e dimensioni.
  • --compare-dest=/some/directorysignifica che i file identici in quella directory e l'albero dei sorgenti non vengono copiati. Si noti che il percorso è relativo alla directory di destinazione.

Rsync copia tutte le directory, anche se nessun file finisce lì. Per sbarazzarsi di queste directory vuote, esegui find -depth CHANGES_ONLY -type d -empty -delete(o se il tuo findnon ha -deletee -empty, esegui find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null).

Quindi crea l'archivio dalla CHANGES_ONLYdirectory.

La via pedonale

Attraversa la directory con il tuo file. Salta i file identici all'originale. Creare directory nella destinazione, se necessario. Copia i file modificati.

cd ORIGINAL_AND_MY_CHANGES
find . \! -type d -exec sh -c '
  for x; do
    if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi
    [ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}"
    cp -p "$x" "../CHANGES_ONLY/$x"
  done
' {} +

È una soluzione ancora migliore di quella di enzotib perché posso mettere MY_CHANGES nel controllo del codice sorgente e aggiornare / tenere traccia di queste modifiche (se aggiorno il file batch di rsync sotto il controllo del codice sorgente sarà impossibile vedere quali file sono stati modificati)
Dmitry

@Dmitry Se stai usando il controllo del codice sorgente, perché non mettere import / track ORIGINALe creare ORIGINAL_AND_MY_CHANGESun ramo? Quindi CHANGESscoprilo con un comando scm.
Gilles 'SO- smetti di essere malvagio' il

Nel mio caso ORIGINALsi tratta di fonti della piattaforma Android (3 GB, 126000 file). Anche l'esecuzione di rsync richiede ~ 15-20 minuti. Penso che l'aggiunta di tutto questo sotto il controllo del codice sorgente richiederà troppo tempo e spazio.
Dmitry,

@Dmitry Che allora lo risolve. Se si tratta di fonti Android, usa repo e git. Lavora sul tuo ramo. È abbastanza difficile gestire quelli con il controllo della versione, rabbrividisco pensare a come potrebbe essere senza di essa. Fortunatamente git è molto bravo a gestire le filiali locali.
Gilles 'SO- smetti di essere malvagio' il

Sfortunatamente si tratta di fonti Android personalizzate senza repository repository / git.
Dmitry,

5

Il comando

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/

produrrebbe un FILE batch contenente le modifiche richieste (senza modificare nulla).

La patch potrebbe essere applicata su un altro sito, dove si prende il batch FILE, con

rsync --read-batch=FILE ORIGINAL/
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.