El Linux patch
El comando le posibilita transferir los cambios de un conjunto de archivos a otro conjunto de archivos de forma rápida y segura. Aprender cómo utilizar patch
la forma sencilla.
Los comandos patch y diff
Imagina que tienes un archivo de texto en tu computadora. Recibe una versión modificada de ese archivo de texto de otra persona. ¿Cómo transfieres rápidamente todos los cambios del archivo modificado a tu archivo original? Ahí es donde patch
y diff
ven a jugar. patch
y diff
se encuentran en Linux y otros sistemas operativos similares a Unix, como macOS.
los diff
comando examina dos versiones diferentes de un archivo y enumera las diferencias entre ellos. Las diferencias se pueden almacenar en un archivo llamado archivo de parche.
los patch
El comando puede leer un archivo de parche y utilizar el contenido como un conjunto de instrucciones. Siguiendo esas instrucciones, los cambios en el archivo modificado son replicado en el original expediente.
Ahora imagine que ese procedimiento ocurre en un directorio completo de archivos de texto. Todo de una vez. Ese es el poder de patch
.
A veces no te envían los archivos modificados. Todo lo que se le envía es el archivo de parche. ¿Por qué enviar docenas de archivos cuando puede enviar un archivo o publicar un archivo para descargarlo fácilmente?
¿Qué hace con el archivo de parche para parchear verdaderamente sus archivos? Aparte de ser casi un trabalenguas, además es una buena pregunta. Lo guiaremos en este post.
los patch
El comando es usado con mayor frecuencia por personas que trabajan con archivos de código fuente de software, pero funciona igualmente bien con cualquier conjunto de archivos de texto, sea cual sea su objetivo, código fuente o no.
RELACIONADO: Cómo comparar dos archivos de texto en la terminal de Linux
Nuestro escenario de ejemplo
En este escenario, estamos en un directorio llamado trabajo que contiene otros dos directorios. Uno se llama laboral, y el otro se llama más reciente. El directorio de trabajo contiene un conjunto de archivos de código fuente. El directorio más reciente contiene la versión más reciente de esos archivos de código fuente, algunos de los cuales han sido modificados.
Para estar seguro, el directorio de trabajo es una copia de la versión actual de los archivos de texto. No es la única copia de ellos.
Hallar las diferencias entre dos versiones de un archivo
los diff
comando encuentra las diferencias entre dos archivos. Su acción predeterminada es listar las líneas modificadas en la ventana del terminal.
Un archivo se llama slang.c
. Compararemos la versión del directorio de trabajo con la del directorio más reciente.
los -u
la opción (unificada) dice diff
para enumerar además algunas de las líneas de texto no modificadas antes y después de cada una de las secciones modificadas. Estas líneas se denominan líneas de contexto. Ellos ayudan al patch
ubicar con precisión dónde se debe realizar un cambio en el archivo original.
Proporcionamos los nombres de los archivos para que diff
sabe qué archivos comparar. Primero se enumera el archivo original, después el archivo modificado. Este es el comando que emitimos a diff
:
diff -u working/slang.c latest/slang.c
diff
produce una lista de salida que muestra las diferencias entre los archivos. Si los archivos fueran idénticos, no se incluiría ningún resultado en el listado. Viendo este tipo de salida de diff
confirma que existen diferencias entre las dos versiones de archivo y que el archivo original necesita un parche.
Hacer un archivo de parche
Para capturar esas diferencias en un archivo de parche, use el siguiente comando. Es el mismo comando que el anterior, con la salida de diff
redirigido a un archivo llamado slang.patch.
diff -u working/slang.c latest/slang.c > slang.patch
El nombre del archivo de parche es arbitrario. Puedes llamarlo como quieras. Darle una extensión «.patch» es una buena idea; a pesar de esto, deja claro qué tipo de archivo es.
Para hacer patch
actuar sobre el archivo de parche y modificar el archivo de trabajo / slang.c, use el siguiente comando. los -u
opción (unificada) posibilita patch
sepa que el archivo de parche contiene líneas de contexto unificadas. Dicho de otra forma, usamos la opción -u con diff, por lo que usamos la -u
opción con patch
.
parche -u working.slang.c -i slang.patch
Si todo va bien, hay una sola línea de salida que le dice patch
está parcheando el archivo.
Hacer una copia de seguridad del archivo original
Podemos instruir patch
para hacer una copia de seguridad de los archivos parcheados antes de que se modifiquen a través de el -b
opción (copia de seguridad). los -i
La opción (entrada) le dice al parche el nombre del archivo de parche a utilizar:
patch -u -b working.slang.c -i slang.patch
El archivo está parcheado como antes, sin diferencias visibles en la salida. A pesar de esto, si observa la carpeta de trabajo, verá que se ha creado el archivo llamado slang.c.orig. Las marcas de fecha y hora de los archivos muestran que slang.c.orig es el archivo original y slang.c es un archivo nuevo creado por patch
.
Usando diff con directorios
Nosotros podemos utilizar diff
para crear un archivo de parche que contenga todas las diferencias entre los archivos en dos directorios. Después podemos utilizar ese archivo de parche con patch
para que esas diferencias se apliquen a los archivos en la carpeta de trabajo con un solo comando.
Las alternativas que usaremos con diff
son los -u
(contexto unificado) que hemos utilizado previamente, la -r
(recursiva) opción para hacer diff
buscar en cualquier subdirectorio y el -N
(nuevo archivo) opción.
los -N
la opción dice diff
cómo manejar archivos en el directorio más reciente que no están en el directorio de trabajo. Fuerza diff
poner instrucciones en el archivo de parche para quepatch
crea archivos que están presentes en el directorio más reciente pero que faltan en el directorio de trabajo.
Puede agrupar las alternativas para que utilicen un solo guión (-
).
Tenga en cuenta que solo proporcionamos los nombres de directorio, no estamos diciendo diff
para mirar archivos específicos:
diff -ruN working/ latest/ > slang.patch
slang.patch» width=»646″ height=»77″ onload=»pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);» onerror=»this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);»>
Echando un vistazo dentro del archivo de parche
Echemos un vistazo rápido al archivo de parche. Usaremos less
para mirar su contenido.
La parte de arriba del archivo muestra las diferencias entre las dos versiones de slang.c.
Desplazándonos hacia abajo por el archivo de parche, vemos que después describe los cambios en otro archivo llamado structs.h. Esto verifica que el archivo de parche definitivamente contiene las diferencias entre las diferentes versiones de varios archivos.
Mira antes de saltar
Parchear una gran colección de archivos puede ser un poco desconcertante, por lo tanto vamos a usar la --dry-run
opción para chequear que todo está bien antes de dar el paso y comprometernos a realizar los cambios.
los --dry-run
la opción dice patch
para hacer todo, aparte de modificar los archivos. patch
realizará todas sus comprobaciones previas al vuelo en los archivos y, si encuentra algún problema, lo informará. De cualquier forma, no se modifica ningún archivo.
Si no se informan problemas, podemos repetir el comando sin el --dry-run
opción y parchear nuestros archivos con confianza.
los -d
(directorio) opción decir patch
en qué directorio trabajar.
Tenga en cuenta que estamos no usando el -i
(entrada) opción para contar patch
qué archivo de parche contiene las instrucciones de diff
. En cambio, estamos redirigiendo el archivo de parche a patch
con <
.
patch --dry-run -ruN -d working < slang.patch
De todo el directorio, diff
encontré dos archivos para parchear. Las instrucciones relativas a las modificaciones para esos dos archivos han sido verificadas por patch
y no se han reportado problemas.
Los controles previos al vuelo están bien; estamos listos para despegar.
Aplicar parches a un directorio
Para aplicar genuinamente los parches a los archivos usamos el comando anterior sin el --dry-run
opción.
patch -ruN -d working < slang.patch
Esta vez, cada línea de salida no comienza con «comprobación», cada línea comienza con «parcheo».
Y no se informan problemas. Podemos compilar nuestro código fuente y tendremos la última versión del software.
Resuelva sus diferencias
Esta es, con mucho, la forma más fácil y segura de utilizar patch
. Copie sus archivos de destino a una carpeta y parchee esa carpeta. Cópielos de nuevo cuando esté satisfecho de que el procedimiento de parcheo se haya completado sin errores.
setTimeout(function(){
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘335401813750447’);
fbq(‘track’, ‘PageView’);
},3000);