[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


65. Differenze tra i file

Spesso esiste la necessità di confrontare il contenuto di file differenti per verificare se esistono delle differenze, e soprattutto per conoscere quali sono, quando queste non sono troppe. Se le differenze tra i due file sono in numero ragionevolmente contenuto, si può generarne un rapporto, in modo da poter ottenere uno dei due file a partire dall'altro, assieme a tale elenco di variazioni.

Questo rapporto sulle differenze viene definito prevalentemente patch, e queste differenze si applicano a un file, o a una serie di file, per ottenere altrettanti file aggiornati.

Esistono tanti modi di costruire un file di differenze. Si distinguono in particolare due situazioni: i file di testo e gli altri. Si può comprendere che in un file di testo, tipicamente un sorgente di un programma, i cambiamenti avvengano a livello di righe, nel senso che se ne possono aggiungere, togliere e modificare. In un file binario invece, non avendo il riferimento delle righe, il problema è più complesso. La gestione delle differenze tra i file riguarda prevalentemente i file di testo normale, ed è di questo che si vuole trattare in questo capitolo.

65.1 Creazione di un file di differenze con diff

Il programma più importante per analizzare le differenze tra due file di testo è `diff'. Può funzionare con diverse modalità, per determinare semplicemente se una coppia di file è identica o meno, oppure per indicare le differenze che ci sono tra i due, con maggiore o minore dettaglio di informazioni al riguardo. La sintassi sintetica di questo programma è molto semplice.

diff [<opzioni>] <file1> <file2>

Il risultato del confronto dei file viene emesso attraverso lo standard output.

65.1.1 Regolazione della sensibilità di diff

Quando si confrontano file di testo, può darsi che alcuni tipi di differenze non siano da considerare, come per esempio l'aggiunta di spazi alla fine di una riga, o l'inserzione di righe vuote addizionali. Inoltre, si può desiderare si conoscere semplicemente se esiste una qualche differenza, senza entrare troppo nel dettaglio. Questa sensibilità alle differenze viene definita attraverso l'uso di opzioni apposite. Le più importanti sono elencate di seguito.

Rapporto sommario

-q | --brief

Attraverso questa opzione si richiede a `diff' di informare semplicemente sull'esistenza di differenze tra due file, senza l'indicazione esplicita di queste.

Maiuscole e minuscole

-i | --ignore-case

Attraverso questa opzione si può richiedere a `diff' di ignorare la differenza tra maiuscole e minuscole. Con questa opzione, le due righe seguenti sono considerate equivalenti.

Chi va piano,

chi va PIANO,
Spaziatura orizzontale e verticale

-b | --ignore-space-change

Questa opzione permette di fare ignorare a `diff' le differenze dovute a una diversa spaziatura orizzontale del testo. Questo riguarda quindi, sia il carattere spazio, <SP>, sia il carattere di tabulazione, <HT>. Con questa opzione, le due righe seguenti sono considerate equivalenti.

va sano e va lontano

va sano  e   va lontano

---------

-w | --ignore-all-space

Questa opzione permette di fare ignorare completamente a `diff' la presenza degli spazi. Per esempio, con questa opzione, le due righe seguenti sono equivalenti.

vasano e va lon   tano

va sano  e  va lontano

---------

-B | --ignore-blank-lines

Questa opzione permette di fare ignorare a `diff' le differenze dovute alla presenza o assenza di righe vuote. Deve trattarsi però di righe completamente vuote, cioè composte esclusivamente dal codice di interruzione di riga.

65.1.2 Confronto binario o testuale

Prima di iniziare un confronto tra due file, `diff' verifica che si tratti di file di testo in base al contenuto di alcune righe iniziali. Se `diff' incontra il carattere <NUL>, a meno che siano state usate opzioni particolari in senso contrario, assume che si tratti di un file binario e verifica semplicemente se i file sono identici.

Confronto binario

--binary

Il confronto binario può essere imposto attraverso questa opzione, e ciò che si ottiene è solo la verifica sull'identicità dei file. Se la prima parte di uno dei file da confrontare contiene il carattere <NUL>, `diff' assume implicitamente che debba essere eseguito un confronto binario.

Confronto testuale

-a | --text

Il confronto testuale, cioè quello normale, può essere imposto con questa opzione anche in presenza di caratteri <NUL> iniziali, per esempio quando si vogliono confrontare file generati da programmi per l'elaborazione testi che sfruttano quel carattere per scopi particolari.

65.1.3 Differenze senza contesto

Il funzionamento normale di `diff' prevede l'emissione attraverso lo standard output dell'indicazione delle sole differenze tra i file, secondo il formato seguente:

<comando>
< <riga-primo-file>
< <riga-primo-file>
< ...
---
> <riga-secondo-file>
> <riga-secondo-file>
> ...

In questo tipo di notazione, è il «comando» a stabilire l'operazione da compiere. Il comando si compone di tre parti: il numero di una riga, o di un intervallo di righe del primo file; una lettera che definisce l'operazione da compiere; il numero di una riga, o di un intervallo di righe del secondo file.

<righe-file1><azione><righe-file2>

Si distinguono le tre azioni seguenti.

Quando si vogliono distribuire file di differenze (o delle patch, se si preferisce il termine) per consentire ad altri di ottenere degli aggiornamenti da un file di partenza, è sconsigliabile l'utilizzo di questo formato, benché si tratti di quello predefinito per `diff', secondo lo standard POSIX.

Esempi

Per verificare in pratica il funzionamento di `diff' in modo da ottenere l'indicazione delle differenze tra due file senza informazioni sul contesto, viene proposto il confronto tra i due file seguenti.

Chi va piano,
va sano
e va lontano

---------

chi va piano,
va     sano
e va lontano

I nomi dei due file siano rispettivamente: `primo' e `secondo'.

diff primo secondo[Invio]

1,2c1,2
< Chi va piano,
< va sano
---
> chi va piano,
> va     sano

In pratica, le prime due righe del primo file vanno sostituite con le prime due del secondo, mentre la terza riga è la stessa in entrambi i file.

diff -i primo secondo[Invio]

2c2
< va sano
---
> va     sano

In questo caso, utilizzando l'opzione `-i', si vogliono ignorare le differenze tra lettere maiuscole e minuscole, pertanto risulta diversa solo la seconda riga.

diff -b primo secondo[Invio]

1c1
< Chi va piano,
---
> chi va piano,

In questo caso, utilizzando l'opzione `-b' si vogliono ignorare le differenze dovute a un uso differente delle spaziature tra le parole, pertanto risulta diversa solo la prima riga.

65.1.4 Formato contestuale standard

Il funzionamento normale di `diff' prevede l'emissione attraverso lo standard output dell'indicazione delle sole differenze tra i file, ma ciò è generalmente poco adatto alla distribuzione di file di differenze. Per questo è preferibile utilizzare un formato che, assieme alle modifiche, inserisca anche alcune righe di riferimento aggiuntive. In questo modo, il programma che deve applicare le modifiche, può agire anche se il contenuto del file sul quale vengono applicate ha subito piccoli spostamenti. Si ottiene un formato contestuale standard quando si utilizza l'opzione seguente:

-c | -C <righe> | --context[=<righe>]

Se viene indicato il numero di righe, si intende che venga utilizzato almeno quel numero di righe di riferimento contestuale. Se questo valore non viene indicato, si intende che siano tre. Il minimo perché il programma `patch' possa eseguire il suo compito è di due righe contestuali.

Il risultato di una comparazione contestuale standard è preceduto da due righe di intestazione contenenti l'indicazione dei due file.

*** <file1> <data-di-modifica-del-primo-file>
--- <file2> <data-di-modifica-del-secondo-file>

Successivamente appaiono i blocchi delle differenze, strutturati nel modo seguente:

***************
*** <righe-primo-file> ****
  <riga-primo-file>
  <riga-primo-file>
  ...
--- <righe-corrispondenti-secondo-file> ----
  <riga-secondo-file>
  <riga-secondo-file>
  ...

Si deve osservare che le righe vengono indicate a partire dalla terza colonna, lasciando cioè due spazi dall'inizio. La prima colonna viene utilizzata per indicare il ruolo particolare di quella riga:

Esempi

Per verificare in pratica il funzionamento di `diff' in modo da utilizzare il formato contestuale standard, viene proposto il confronto tra i due file seguenti.

Chi va piano,
va sano
e va lontano

---------

Chi va forte,
va alla morte;

chi va piano,
va     sano
e va lontano

I nomi dei due file siano rispettivamente: `primo' e `secondo'.

diff -c primo secondo[Invio]

*** primo	Tue Mar  3 08:12:30 1998
--- secondo	Wed Mar  4 11:16:32 1998
***************
*** 1,3 ****
! Chi va piano,
! va sano
  e va lontano
--- 1,6 ----
! Chi va forte,
! va alla morte;
! 
! chi va piano,
! va     sano
  e va lontano

In breve, le prime tre righe del primo file vanno sostituite con le prime sei del secondo, e l'unica riga in comune è l'ultima.

diff -c -i primo secondo[Invio]

*** primo	Tue Mar  3 08:12:30 1998
--- secondo	Wed Mar  4 11:16:32 1998
***************
*** 1,3 ****
  Chi va piano,
! va sano
  e va lontano
--- 1,6 ----
+ Chi va forte,
+ va alla morte;
+ 
  chi va piano,
! va     sano
  e va lontano

In questo caso, vanno aggiunte le prime tre righe del secondo file, quindi si incontra una riga uguale, dal momento che non contano le differenze tra lettere maiuscole e minuscole, infine viene sostituita una riga a causa della spaziatura orizzontale differente.

diff -b -i -c primo secondo[Invio]

*** primo	Tue Mar  3 08:12:30 1998
--- secondo	Wed Mar  4 11:16:32 1998
***************
*** 1,3 ****
--- 1,6 ----
+ Chi va forte,
+ va alla morte;
+ 
  chi va piano,
  va     sano
  e va lontano

In questo caso, avendo indicato che non contano le differenze dovute alla diversa spaziatura orizzontale e all'uso delle maiuscole, le ultime tre righe del secondo file corrispondono esattamente al primo file. In questo modo, queste non sono state indicate nella parte che riguarda il primo file.

65.1.5 Formato contestuale unificato

A fianco del formato contestuale standard, si pone un altro tipo di indicazione delle modifiche, definito «unificato», che ha il vantaggio di essere più compatto, e lo svantaggio di essere disponibile solo negli strumenti GNU. Per selezionare questo tipo di risultato si utilizza una delle opzioni seguenti.

-u | -U <righe> | --unified[=<righe>]

Se viene indicato il numero di righe, si intende che venga utilizzato almeno quel numero di righe di riferimento contestuale. Se questo valore non viene indicato, si intende che siano tre. Il minimo perché il programma `patch' possa eseguire il suo compito è di due righe contestuali.

Il risultato di una comparazione contestuale unificata è preceduto da due righe di intestazione contenenti l'indicazione dei due file.

--- <file1> <data-di-modifica-del-primo-file>
+++ <file2> <data-di-modifica-del-secondo-file>

Successivamente appaiono i blocchi delle differenze, strutturati nel modo seguente:

@@ -<righe-primo-file> +<righe-secondo-file> @@
 <riga-di-uno-dei-file>
 <riga-di-uno-dei-file>
 ...

In modo simile al caso del formato contestuale standard, le righe sono riportate a partire dalla seconda colonna, lasciando il primo carattere libero per indicare l'operazione da compiere:

Esempi

Per verificare in pratica il funzionamento di `diff' in modo da utilizzare il formato contestuale unificato, vengono proposti gli stessi esempi già visti nella sezione precedente.

diff -u primo secondo[Invio]

--- primo	Tue Mar  3 08:12:30 1998
+++ secondo	Wed Mar  4 11:16:32 1998
@@ -1,3 +1,6 @@
-Chi va piano,
-va sano
+Chi va forte,
+va alla morte;
+
+chi va piano,
+va     sano
 e va lontano

In breve, le prime tre righe del primo file vanno sostituite con le prime sei del secondo, e l'unica riga in comune è l'ultima.

diff -u -i primo secondo[Invio]

--- primo	Tue Mar  3 08:12:30 1998
+++ secondo	Wed Mar  4 11:16:32 1998
@@ -1,3 +1,6 @@
+Chi va forte,
+va alla morte;
+
 Chi va piano,
-va sano
+va     sano
 e va lontano

In questo caso, vanno aggiunte le prime tre righe del secondo file, quindi si incontra una riga uguale, dal momento che non contano le differenze tra lettere maiuscole e minuscole, infine viene sostituita una riga a causa della spaziatura orizzontale differente.

diff -b -i -c primo secondo[Invio]

--- primo	Tue Mar  3 08:12:30 1998
+++ secondo	Wed Mar  4 11:16:32 1998
@@ -1,3 +1,6 @@
+Chi va forte,
+va alla morte;
+
 Chi va piano,
 va sano
 e va lontano

In questo caso, avendo indicato che non contano le differenze dovute alla diversa spaziatura orizzontale e all'uso delle maiuscole, le ultime tre righe del secondo file corrispondono esattamente al primo file. In questo modo, queste non sono state indicate nella parte che riguarda il primo file.

65.1.6 Confronto dei file di due directory

`diff' è in grado di generare un file unico di differenze, dal confronto di tutti i file di una directory con altrettanti file con lo stesso nome contenuti in un'altra. per questo, è sufficiente indicare il confronto di due directory, invece che di due file.

Se si desidera continuare l'analisi anche nelle sottodirectory successive, si può utilizzare l'opzione seguente:

-r | --recursive
Esempi

diff -u uno due

Si suppone che `uno/' e `due/' siano due sottodirectory della directory corrente nel momento in cui si esegue `diff'. Ciò che si ottiene attraverso lo standard output è l'elenco delle modifiche dei vari file incontrati in entrambe le directory. Quello che segue è un estratto delle intestazioni in cui si vede in che modo sono indicati i file, assieme al loro percorso relativo.

...
--- uno/primo	Thu Mar  5 09:48:10 1998
+++ due/primo	Fri Mar  6 08:30:07 1998
...
--- uno/secondo	Wed Mar  4 09:23:52 1998
+++ due/secondo	Fri Mar  6 08:29:59 1998
...

---------

diff -u -r uno due

Questa volta, il comando indicato come esempio utilizza anche l'opzione `-r' che indica a `diff' di attraversare anche le sottodirectory che fossero contenute eventualmente.

65.1.7 Come si prepara un file di differenze

Quando si prepara un file di differenze, è opportuno usare un po' di accortezza per facilitare il lavoro di chi poi deve applicare queste modifiche. È il caso di distinguere due situazioni fondamentali: le differenze riferite a un file singolo e quelle relative a un intero ramo di directory.

Per prima cosa occorre decidere il tipo di formato: quello predefinito non è molto comodo perché non contiene le informazioni sui nomi dei file, e quello contestuale unificato dovrebbe essere il migliore. Tuttavia, quando si devono produrre file di differenze da utilizzare con strumenti strettamente POSIX, ci si deve accontentare del formato contestuale standard.

In generale, è importante l'ordine in cui si indicano i file o le directory tra gli argomenti di `diff': il primo dei due nomi rappresenta la situazione precedente, mentre il secondo quella nuova, ovvero l'aggiornamento verso cui si vuole andare. La situazione classica è quella in cui si modifica un file, ma prima di intervenire se ne salva una copia con la tipica estensione `.orig'. Si osservi l'esempio seguente:

diff -u prova.txt.orig prova.txt > prova.diff

Il file `prova.txt' è stato modificato, ma prima di farlo ne è stata salvata una copia con il nome `prova.txt.orig'. Il comando genera un file di differenze tra `prova.txt.orig' e `prova.txt'.

Per realizzare un file di differenze di un ramo intero di directory, si interviene in modo simile: si fa una copia del ramo, si modifica quello che si vuole nei file del ramo che si intende debba contenere gli aggiornamenti, e quindi si utilizza `diff':

diff -u -r prova.orig prova > prova.diff

In questo caso, si intende fare riferimento al confronto tra le directory `prova.orig/' e `prova/'. Il file di differenze che si ottiene è unico per tutti i file che risultano modificati effettivamente.

65.2 Applicazione delle modifiche con patch

Il programma più adatto per applicare delle modifiche è `patch', il quale di solito è in grado di determinare automaticamente il tipo di formato utilizzato, e di saltare eventuali righe iniziali o finali aggiuntive. In pratica, con `patch' è possibile utilizzare file trasmessi come allegato nei messaggi di posta elettronica, senza doverli estrapolare.

patch [<opzioni>] < <file-di-differenze>

`patch' utilizza generalmente lo standard input per ricevere i file di modifiche. Questi devono contenere l'indicazione del file da modificare, e per questo si possono utilizzare soltanto file di differenze in formato contestuale (compreso quello unificato).

In linea di massima, `patch' sovrascrive i file a cui si vogliono applicare delle modifiche, a meno che venga specificata un'opzione con la quale si richiede l'accantonamento di una copia della versione precedente. In questo caso, il file originale viene rinominato (in condizioni normali gli viene aggiunta l'estensione `.orig') e gli aggiornamenti vengono applicati a questo file ottenendone un altro con lo stesso nome di quello originale. `patch' cerca di applicare le modifiche anche quando il file di partenza non risulta perfettamente corrispondente a quanto indicato nel file di differenze. Se qualche blocco di modifiche non può essere applicato, questi vengono indicati in un file terminante con l'estensione `.rej'.

La tabella 65.1 riepiloga brevemente le opzioni più comuni del programma `patch' GNU.

Opzione Descrizione
-d <directory> Modifica la directory di lavoro prima di iniziare.
-pn Elimina n barre oblique iniziali da un percorso.
-o <file-aggiornato> Indica precisamente il file da ottenere applicando le modifiche.
-b Mantiene una copia della versione precedente.
-l Tratta come equivalenti le sequenze di spazi orizzontali.
-r <file-rigetti> Indica precisamente il file che deve contenere gli errori.
-R Applica le modifiche in modo inverso.
-N Ignora le modifiche che sembrano essere già state applicate.

Tabella 65.1: Opzioni comuni di `patch'. Tutte tranne `-b' sono conformi allo standard POSIX.

65.2.1 Definizione dei file da modificare e del file di differenze

In condizioni normali, precisamente quando si dispone di file di differenze in formato contestuale (standard o unificato), non è necessario fornire a `patch' il nome del file su cui intervenire per applicare le modifiche, perché questo è indicato all'interno del file che le contiene. Tuttavia, il formato predefinito lo impone, e in ogni caso può essere utile indicare precisamente a `patch' il nome del file su cui intervenire.

patch [<opzioni>] <file-originale> [<file-di-differenze>]

Lo schema mostra semplicemente che è sufficiente accodare dopo le opzioni il nome del file originale al quale si vogliono applicare le modifiche. Queste possono essere contenute in un file indicato come argomento successivo, oppure fornito attraverso lo standard input, come si fa di solito. In alternativa, il file di differenze può anche essere indicato in modo esplicito attraverso l'opzione `-i' (ovvero `--input').

Esempi

patch prova prova.diff

Applica al file `prova' le modifiche contenute nel file `prova.diff'. Il file `prova' viene sovrascritto.

patch prova < prova.diff

Esattamente come nell'esempio precedente.

patch -i prova.diff prova

Esattamente come nell'esempio precedente.

patch --input=prova.diff prova

Esattamente come nell'esempio precedente.

65.2.2 Definizione esplicita del formato del file di differenze

In alcune circostanze, può essere utile, o necessario, definire esplicitamente di quale tipo sia il formato del file di differenze. A questo proposito si utilizzano alcune opzioni:

65.2.3 Differenze multiple e directory

Un file di differenze che contiene informazioni su più coppie di file, deve essere di tipo contestuale (standard o unificato). Quando è stato generato facendo riferimento al contenuto di una directory, i nomi dei file presi in considerazione contengono l'indicazione di un percorso, e per riprodurre le modifiche in ambito locale, occorre tenere conto della posizione in cui cominciano a trovarsi i dati.

Inoltre, la directory corrente, nel momento in cui si avvia il programma `patch', è importante per determinare quali siano i file a cui si devono applicare le modifiche.

Opzioni

-d <directory-di-riferimento> | --directory=<directory-di-riferimento>

Questa opzione permette di definire la directory di lavoro per `patch'.

-pn | --strip=n

In questo modo è possibile «togliere» un numero stabilito di barre oblique di separazione all'interno dei percorsi indicati per i file a cui applicare le modifiche. Questa opzione è praticamente obbligatoria in presenza di file di differenze in cui le informazioni sui file contengono un percorso. In generale, quando queste vengono applicate in un contesto equivalente a quello nel quale sono state generate, si utilizza l'opzione `-p0', che indica il mantenimento della situazione attuale.

Esempi

patch -d ~/prove < prova.diff

Prima di applicare le modifiche contenute nel file di differenze `prova.diff', si sposta nella directory `~/prove/'.

patch -p0 < prova.diff

Applica le modifiche contenute nel file `prova.diff' che presumibilmente contiene informazioni sui percorsi. L'opzione `-p0' garantisce che a partire dalla directory corrente si articolano gli stessi percorsi che appaiono nel file di differenze.

patch -p1 < prova.diff

Applica le modifiche contenute nel file `prova.diff' che presumibilmente contiene informazioni sui percorsi. L'opzione `-p1' richiede l'eliminazione della prima barra obliqua nei percorsi, e questo, presumibilmente, per eliminare il primo livello di directory. Se all'interno del file di differenze si fa riferimento al file `x/y/z/prova', significa che le modifiche relative vanno applicate localmente al file `y/z/prova'.

Nel caso in cui all'interno del file di differenze si facesse riferimento al file `./x/y/z/prova', eliminando la prima barra obliqua di questo percorso, non si otterrebbe alcun cambiamento, dal momento che ciò produrrebbe il percorso `x/y/z/prova' che è equivalente al primo. Questo significa che prima di decidere quante barre oblique togliere da un percorso, occorre osservare il contenuto del file di differenze.

In modo analogo, nel caso in cui all'interno del file di differenze si facesse riferimento al file `/x/y/z/prova', che come si vede è indicato con un percorso assoluto a partire dalla radice, eliminando la prima barra obliqua si ottiene un percorso relativo: `x/y/z/prova'.

65.2.4 Conservazione delle versioni precedenti

In condizioni normali, `patch' sovrascrive i file a cui si applicano le modifiche. Per evitarlo è possibile definire precisamente il nome del file da generare, oppure si può gestire il sistema di mantenimento delle versioni precedenti, utilizzando in particolare l'opzione `-b'.

Opzioni

-o <file-aggiornato> | --output=<file-aggiornato>

Invece di modificare il file originale, ne crea uno nuovo, utilizzato il nome indicato come argomento dell'opzione.

-b | --backup

Attiva la conservazione della versioni precedenti. In condizioni normali, con questa opzione si ottiene di salvare i file, prima del loro aggiornamento, utilizzando l'estensione aggiuntiva `.orig'.

-z <suffisso-di-backup> | --suffix=<suffisso-di-backup>

Permette di definire il suffisso (ovvero l'estensione) da utilizzare per le eventuali copie di sicurezza delle versioni precedenti. Se non viene specificato con questa opzione, si utilizza il simbolo contenuto nella variabile di ambiente `SIMPLE_BACKUP_SUFFIX'. Se anche questa variabile non è stata predisposta, si utilizza l'estensione `.orig'.

-V <tipo-di-backup> | --version-control=<tipo-di-backup>

Permette di definire esplicitamente il modo con cui gestire le copie di sicurezza delle versioni precedenti, quando si usa anche l'opzione `-b'. Per la precisione cambia il tipo di estensione che viene aggiunto ai file:

  • `t', `numbered'

    le copie di sicurezza hanno un'estensione numerata;

  • `nil', `existing'

    mantiene le copie di sicurezza solo per i file che hanno già una o più copie di sicurezza numerate;

  • `never', `simple'

    esegue una copia di sicurezza semplice, ovvero ne mantiene una sola copia.

Se questa opzione non viene indicata, si prende in considerazione il valore della variabile di ambiente `PATCH_VERSION_CONTROL', o in mancanza di questa, il valore della variabile `VERSION_CONTROL'.

Variabili

PATCH_VERSION_CONTROL

Permette di definire la modalità di gestione delle copie di sicurezza delle versioni precedenti in modo predefinito. I valori attribuibili a questa variabile sono gli stessi utilizzati come argomento dell'opzione `-V'.

VERSION_CONTROL

Questa variabile ha lo stesso significato di `PATCH_VERSION_CONTROL', ma viene presa in considerazione solo in mancanza di questa.

SIMPLE_BACKUP_SUFFIX

Definisce il simbolo da utilizzare come suffisso per i nomi dei file che rappresentano le copie di sicurezza.

Esempi

patch -o aggiornato < prova.diff

Applica le modifiche contenute nel file di differenze `prova.diff' generando il file `aggiornato', senza toccare i file originali.

patch -b < prova.diff

Applica le modifiche contenute nel file di differenze `prova.diff', avendo cura di fare una copia di sicurezza dei file che aggiorna, prima di modificarli.

patch -b -z .vecchio < prova.diff

Applica le modifiche contenute nel file di differenze `prova.diff', avendo cura di fare una copia di sicurezza dei file che aggiorna utilizzando per questo l'estensione `.vecchio', prima di modificarli.

patch -b -V numbered < prova.diff

Applica le modifiche contenute nel file di differenze `prova.diff', avendo cura di fare una copia di sicurezza dei file che aggiorna utilizzando per questo un'estensione contenente un numero progressivo, prima di modificarli. La prima di queste copie di sicurezza avrà l'estensione `.~1~', la seconda `.~2~', e via di seguito.

65.2.5 Applicazione di modifiche imperfette

`patch' è generalmente in grado di applicare delle modifiche anche a file che non sono perfettamente identici a quelli con cui sono stati costruiti i file di differenze. Tuttavia, ci sono situazioni in cui `patch', da solo, non è in grado di poter prendere una decisione autonoma.

Può capitare che i file di modifiche vengano alterati involontariamente, per esempio a causa di una trasmissione attraverso la posta elettronica o per una modifica attraverso un programma per la gestione di file di testo. In questi casi potrebbero essere alterate le spaziature orizzontali attraverso una sostituzione dei caratteri di tabulazione con caratteri spazio, e viceversa. Un problema del genere può essere risolto utilizzando l'opzione `-l'.

-l | --ignore-white-space

In questo modo, una sequenza di spazi qualunque, equivale a un'altra sequenza di spazi, indipendentemente dal fatto che siano stati usati caratteri di tabulazione, o caratteri spazio veri e propri, e indipendentemente dalla loro quantità.

65.2.6 Altre anomalie

Quando `patch' incontra dei problemi che non è in grado di risolvere da solo, richiede un intervento, ponendo delle domande all'utente. Se ciò accade, si può decidere di guidare `patch' nell'applicazione delle modifiche o di interrompere il procedimento.

Tutte le modifiche rigettate, vengono salvate in file terminanti con l'estensione `.rej', a meno che sia stabilito diversamente con l'opzione `-r'.

-r <file-degli-errori> | --reject-file=<file-degli-errori>

Con questa opzione, in pratica, si stabilisce direttamente il nome del file che deve contenere le informazioni sulle modifiche che non sono state applicate per qualunque motivo.

65.2.7 Differenze invertite

Alla fine delle sezioni dedicate alla creazione di un file di differenze è stato chiarito che l'ordine in cui vanno indicati i file o le directory da confrontare, deve essere tale da avere prima l'oggetto che rappresenta la versione precedente, e dopo quello che rappresenta l'oggetto aggiornato.

Alle volte si hanno per le mani file di differenze ottenuti in modo inverso rispetto alle intenzioni reali, e per questo occorre richiedere a `patch' di adeguarvisi, se possibile.

Opzioni

-R | --reverse

Richiede a `patch' di intendere il file di differenze in modo inverso rispetto a quello che sembrerebbe.

-N | --forward

Richiede esplicitamente di ignorare le modifiche che sembrano essere state invertite, oppure che sembrano essere già state applicate.

65.3 Riferimenti

La documentazione Info riguardo alla creazione, distribuzione e applicazione di modifiche, è molto dettagliata: diff.info. Per il funzionamento di `patch' in particolare, conviene consultare la pagina di manuale patch(1).

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]