Come applicare una patch a un file (e creare patch) in Linux

PC che mostra un prompt della shell su un desktop Linux

Fatmawati Achmad Zaenuri/Shutterstock.com



Il Linux |_+_| Il comando consente di trasferire le modifiche da un set di file a un altro set di file in modo rapido e sicuro. Impara a usare |_+_| il modo semplice.

I comandi patch e diff

Immagina di avere un file di testo sul tuo computer. Ricevi una versione modificata di quel file di testo da qualcun altro. Come trasferire rapidamente tutte le modifiche dal file modificato al file originale? Ecco dove |_+_| e |_+_| entrare in gioco. |_+_| e |_+_| si trovano in Linux e altri Sistemi operativi Unix-Like , come macOS.





Il |_+_| il comando esamina due diverse versioni di un file ed elenca le differenze tra loro. Le differenze possono essere memorizzate in un file chiamato file di patch.

Il |_+_| Il comando può leggere un file di patch e utilizzare i contenuti come un insieme di istruzioni. Seguendo queste istruzioni, le modifiche nel file modificato sono replicato nell'originale file.



Ora immagina che il processo avvenga su un'intera directory di file di testo. Tutto in una volta. Questo è il potere di |_+_|.

Annuncio pubblicitario

A volte non ti vengono inviati i file modificati. Tutto quello che ti viene inviato è il file di patch. Perché inviare dozzine di file in giro quando puoi inviare un file o pubblicare un file per un facile download?

Cosa fai con il file di patch per correggere effettivamente i tuoi file? Oltre a essere quasi uno scioglilingua, questa è anche una buona domanda. Ti guideremo attraverso questo articolo.



Il |_+_| comando è più spesso utilizzato da persone che lavorano con file di codice sorgente del software, ma funziona ugualmente bene con qualsiasi insieme di file di testo qualunque sia il loro scopo, codice sorgente o meno.

IMPARENTATO: Come confrontare due file di testo nel terminale Linux

Il nostro scenario di esempio

In questo scenario, siamo in una directory chiamata lavoro che contiene altre due directory. uno si chiama Lavorando, e l'altro si chiama più recente . La directory di lavoro contiene una serie di file di codice sorgente. L'ultima directory contiene la versione più recente di quei file di codice sorgente, alcuni dei quali sono stati modificati.

Per sicurezza, la directory di lavoro è una copia della versione corrente dei file di testo. Non è l'unica copia di loro.

Trovare le differenze tra due versioni di un file

Il |_+_| Il comando trova le differenze tra due file. La sua azione predefinita è elencare le righe modificate nella finestra del terminale.

Annuncio pubblicitario

Un file si chiama |_+_|. Confronteremo la versione nella directory di lavoro con quella nella directory più recente.

Il |_+_| opzione (unificata) dice |_+_| per elencare anche alcune delle righe di testo non modificate prima e dopo ciascuna delle sezioni modificate. Queste righe sono chiamate righe di contesto. Aiutano il |_+_| comando individuare esattamente dove deve essere apportata una modifica nel file originale.

Forniamo i nomi dei file in modo che |_+_| sa quali file confrontare. Viene elencato per primo il file originale, quindi il file modificato. Questo è il comando che diamo a |_+_|:

patch

|_+_| produce un elenco di output che mostra le differenze tra i file. Se i file fossero identici, non ci sarebbe alcun output elencato. Vedere questo tipo di output da |_+_| conferma che ci sono differenze tra le due versioni del file e che il file originale necessita di patch.

Creare un file di patch

Per acquisire queste differenze in un file di patch, utilizzare il comando seguente. È lo stesso comando di sopra, con l'output di |_+_| reindirizzato in un file chiamato slang.patch.

patch

Il nome del file di patch è arbitrario. Puoi chiamarlo come vuoi. Dargli un'estensione .patch è una buona idea; tuttavia, poiché chiarisce di che tipo di file si tratta.

Annuncio pubblicitario

Per fare |_+_| agire sul file di patch e modificare il file working/slang.c, utilizzare il seguente comando. Il |_+_| L'opzione (unificata) consente |_+_| sapere che il file di patch contiene righe di contesto unificate. In altre parole, abbiamo usato l'opzione -u con diff, quindi usiamo |_+_| opzione con |_+_|.

patch -u working.slang.c -i slang.patch

Se tutto va bene, c'è una singola riga di output che ti dice |_+_| sta patchando il file.

Fare un backup del file originale

Possiamo istruire |_+_| per fare una copia di backup dei file con patch prima che vengano modificati utilizzando |_+_| (backup) opzione. Il |_+_| (input) l'opzione dice a patch il nome del file di patch da usare:

patch

Il file viene corretto come prima, senza differenze visibili nell'output. Tuttavia, se guardi nella cartella di lavoro, vedrai che è stato creato il file chiamato slang.c.orig. La data e l'ora dei file mostrano che slang.c.orig è il file originale e slang.c è un nuovo file creato da |_+_|.

Utilizzo di diff con le directory

Possiamo usare |_+_| per creare un file di patch che contenga tutte le differenze tra i file in due directory. Possiamo quindi usare quel file di patch con |_+_| per avere quelle differenze applicate ai file nella cartella di lavoro con un singolo comando.

Le opzioni che useremo con |_+_| sono i |_+_| (contesto unificato) che abbiamo usato in precedenza, l'opzione |_+_| opzione (ricorsiva) per creare |_+_| guarda in tutte le sottodirectory e il |_+_| (nuovo file) opzione.

Annuncio pubblicitario

Il |_+_| opzione dice |_+_| come gestire i file nell'ultima directory che non si trovano nella directory di lavoro. Obbliga |_+_| per inserire le istruzioni nel file di patch in modo che|_+_| crea file presenti nella directory più recente ma mancanti nella directory di lavoro.

Puoi raggruppare le opzioni in modo che utilizzino un singolo trattino (|_+_|).

Nota che stiamo fornendo solo i nomi delle directory, non stiamo dicendo |_+_| per guardare file specifici:

diff

diff -ruN working/ latest/>slang.patch

Sbirciando all'interno del file di patch

Diamo una rapida occhiata al file di patch. Useremo |_+_| per guardarne il contenuto.

La parte superiore del file mostra le differenze tra le due versioni di slang.c.

Scorrendo più in basso il file della patch, vediamo che descrive poi le modifiche in un altro file chiamato structs.h. Ciò verifica che il file di patch contenga sicuramente le differenze tra le diverse versioni di più file.

Guarda prima di saltare

Patchare una grande raccolta di file può essere un po' snervante, quindi useremo il |_+_| l'opzione per controllare che tutto sia a posto prima di fare il grande passo e impegnarci ad apportare le modifiche.

Annuncio pubblicitario

Il |_+_| opzione dice |_+_| per fare tutto tranne che per modificare effettivamente i file. |_+_| eseguirà tutti i suoi controlli pre-volo sui file e se incontra problemi, li segnala. In ogni caso, nessun file viene modificato.

Se non vengono segnalati problemi, possiamo ripetere il comando senza |_+_| opzione e patchare con sicurezza i nostri file.

Il |_+_| (directory) opzione tell |_+_| su quale directory lavorare.

Nota che siamo non usando il |_+_| (input) opzione per dire |_+_| quale file di patch contiene le istruzioni di |_+_|. Invece, stiamo reindirizzando il file della patch in |_+_| con |_+_|.

patch

Fuori dall'intera directory, |_+_| trovato due file da correggere. Le istruzioni relative alle modifiche per questi due file sono state verificate da |_+_| , e non sono stati segnalati problemi.

I controlli pre-volo sono OK; siamo pronti per il decollo.

Patch di una directory

Per applicare realmente le patch ai file usiamo il comando precedente senza |_+_| opzione.

diff

Annuncio pubblicitario

Questa volta ogni riga di output non inizia con il controllo, ogni riga inizia con il patching.

E non vengono segnalati problemi. Possiamo compilare il nostro codice sorgente e saremo sull'ultima versione del software.

Risolvi le tue differenze

Questo è di gran lunga il modo più semplice e sicuro per usare |_+_|. Copia i file di destinazione in una cartella e applica una patch a quella cartella. Copiali di nuovo quando sei felice che il processo di patch sia stato completato senza errori.

Comandi Linux
File catrame · pv · gatto · tac · chmod · presa · differenza · sed · Con · uomo · spinto · popd · fsck · testdisk · seguito · fd · pandoc · cd · $PATH · awk · giuntura · jq · piega · unico · journalctl · coda · stato · ls · fstab · buttato fuori · meno · chgrp · chown · rev · Guarda · stringhe · genere · rinominare · cerniera lampo · decomprimere · montare · smontare · installare · fdisk · mkfs · rm · rmdir · rsync · df · gpg · noi · nano · mkdir · a partire dal · ln · toppa · convertire · rclone · brandello · SRM
Processi alias · schermo · superiore · Bello · renice · progresso · strace · sistema · tmux · chsh · storia · in · lotto · libero · quale · dmesg · usermod · ps · chroot · xargs · tty · mignolo · lsof · vmstat · tempo scaduto · parete · · uccisione · dormire · sudo · il suo · volta · gruppoaggiungi · usermod · gruppi · lshw · spegnimento · riavviare · fermare · spegni · passwd · lscpu · crontab · Data · bg · fg
Rete netstat · ping · traceroute · ip · ss · chi è · fail2ban · bmon · voi · dito · nmap · ftp · arricciare · wget · chi · chi sono · In · iptables · ssh-keygen · ufw

IMPARENTATO: I migliori laptop Linux per sviluppatori e appassionati

LEGGI SUCCESSIVO Foto del profilo di Dave McKay Dave McKay
Dave McKay ha usato per la prima volta i computer quando era in voga il nastro di carta perforata, e da allora ha programmato. Dopo oltre 30 anni nel settore IT, ora è un giornalista tecnologico a tempo pieno. Durante la sua carriera ha lavorato come programmatore freelance, manager di un team internazionale di sviluppo software, project manager di servizi IT e, più recentemente, come Data Protection Officer. I suoi scritti sono stati pubblicati da howtogeek.com, cloudavvyit.com, itenterpriser.com e opensource.com. Dave è un evangelista di Linux e un sostenitore dell'open source.
Leggi la biografia completa

Articoli Interessanti