[Linux] diff y patch

Enlaces: https://www.cnblogs.com/cocowool/p/6409643.html

Linux en el Dif y Patch

El papel de impresión de aprendizaje principal de dos comandos: diff y patch. diff y parchear un par de herramientas, el uso de esta herramienta puede obtener los archivos de diferencia de actualización y los archivos de la historia, y actualizaciones en el archivo histórico. En matemáticas, dicho, diff es la diferencia entre los dos conjuntos de operaciones, parche es una colección de dos y operaciones.

ejemplo sencillo

Utilice este ejemplo para ilustrar cómo comparar y archivos de revisión.

Hay dos archivos original.txt y updated.txt, de la siguiente manera:

#include <stdio.h>

function old(){
        printf("This is a file\n");

        return 0;
}
#include stdio.h

function new(){
        printf("This is b file\n");
        return 0;
}

Ejecución  diff original.txt updated.txtresultado para

A continuación apareció por primera vez en los resultados de algunos de los símbolos de alguna explicación. 1,4c1El contenido de esta salida es en realidad para ver el parche, el parche representa 1 Dao dijo a las cuatro líneas en el archivo original.txt deben ser reemplazados en el updated.txt contenido, reemplazando el contenido se updated.txt primera fila. Pueden aparecer tres letras representan diferentes significados, a saber, C representa la actualización, a representa un adicional, d para borrar.

c representa el documento original m, el contenido de n líneas para ser sustituido el contenido del archivo actualizado.
a representa un adicional, entonces el número de la izquierda es sólo un número, pero no un rango, representan un lateral adicional derecho al archivo digital original que representa el contenido.
D representa eliminado. El número de la izquierda puede ser un rango, que representa el contenido que desea eliminar, el derecho es un número que no se elimina si la posición que debe aparecer en el documento actualizado. Algunas personas pueden pensar que detrás de los números es superflua, ya que el parche es retener este número se puede utilizar a la inversa.
<Representa el parche debe borrar el contenido de la parte posterior de la señal.
>Representa el parche debe añadirse detrás de este signo.

Aprender la salida de diff, que creó un parche para el archivo original. La salida es en realidad parches diff, podemos guardar directamente en la salida a un archivo, puede utilizar el símbolo de canalización de hacer esto, de la siguiente manera:

diff original.txt updated.txt > mypatch.patch

Entonces tenemos un archivo de revisión, archivo original se puede actualizar a los archivos actualizados.

patch original.txt -i my patch.patch -o updated-1.txt

Este comando generará un nuevo archivo, se puede ver que nuestro archivo update.txtw anterior exactamente lo mismo.

Parche contexto

Los resultados observados previamente diff patrón dada la necesidad de reemplazar la posición, sólo le da el número de línea, si el archivo de repente añadir una línea en blanco cuando se produce el problema de la aplicación del parche. Alternativamente, si el archivo de parche a la fuente del error en un archivo, si el archivo pasa a tener el mismo número de filas, el parche se puede aplicar con éxito. Y esto es que no queremos ver los resultados. Afortunadamente, diff proporciona un diferentes patrones de resultados para evitar estos problemas anteriores.

diff -c original.txt updated.txt

La comparación de los resultados contenidos en el nombre del archivo, de modo que cuando se aplica el parche, no entrar en el nombre del archivo, ahorrando tiempo y evitando los errores de entrada de nombre de archivo sea posible. Presentar la fecha de modificación y se fue después de que el nombre del archivo. Más abajo se encuentra a 15 asterisco (*) representa el contenido del archivo a sustituir, actualizar, eliminar y así sucesivamente. *Y la -representación digital o digital de la gama que contiene el número de línea, !comenzando con la necesidad de sustituir el contenido de la representación, -expresa la necesidad de eliminar el contenido, expresado la necesidad de aumentar el contenido, archivo de revisión se actualizará en base a este contexto.

patch -i mypatch2.patch -o updated.txt

Tenga en cuenta que aquí, si no se especifica un archivo de salida, el archivo de origen se actualizará (en realidad es el papel del archivo del parche). Por lo general, vamos a aplicar el parche al archivo de origen, por lo general requiere varios archivos para su procesamiento.

Al comparar varios archivos y aplicar el parche

Comparar varios archivos forma más fácil es comando seguido directamente por carpeta, por ejemplo, si contiene subcarpetas, no olvide agregar el parámetro -r.

diff originaldirectory updateddirectory 

También podemos observar los resultados de la comparación contexto

RousseaudeMacBook-Pro:diff rousseau$ diff -c original update
diff -c original/function.txt update/function.txt
*** original/function.txt     Fri Feb 17 09:41:26 2017
--- update/function.txt     Fri Feb 17 09:42:06 2017
***************
*** 1,5 ****
! #includ <stdio.h>

  function main(){
       return 1;
  }
--- 1,8 ----
! #include <stdio.h>
! #include <stdlib.h>

  function main(){
+      printf("This is function main\n");
+
       return 1;
  }
diff -c original/original.txt update/original.txt
*** original/original.txt     Fri Feb 17 09:40:29 2017
--- update/original.txt     Fri Feb 17 09:40:51 2017
***************
*** 1,9 ****
  #include <stdio.h>

! function old(){
!      printf("This is a file\n");

       return 0;
  }

- void 0;
--- 1,8 ----
  #include <stdio.h>

! function newd(){
!      printf("This is a new file\n");

       return 0;
  }

Echemos un vistazo a cómo aplicar el parche para varios archivos, en primer lugar generar un archivo de revisión, que todavía utilizan el formato contexto.diff -c original update > directory.patch

在一个新的目录下拷贝 original 文件夹和补丁文件,执行 patch -i directory.patch,此时会提示找不到文件,因为patch会在当前文件夹查找文件(默认情况下patch会将文件名前的所有文件夹去掉)因为此时补丁文件在文件夹外面,所以我们应当告诉patch不要这么做,使用-p参数。

patch -p0 -i directory.patch

也许有人会问,如果我把补丁文件移动到文件夹中进行打补丁操作不就可以了嘛,注意千万不要这么做。如果文件夹中还有子文件夹,那么patch不会到子文件夹中寻找文件,这样就会对结果产生影响,特别是在不同文件夹中有相同名字的文件的时候。

还原补丁文件的操作

有时候版本需要进行回撤,这时可以使用 -R 参数。

patch -p0 -R -i directory.patch

Unified Format

GNU的diff和patch还提供了一种格式,称为 the unified format。这个格式更加精简,与上下文格式类似。但是不再将源文件和更新文件分开,而是组合在一起。并且没有特殊的替换标志,只有-+

diff -u original update

写在最后

对文本文件进行patch操作时,提前备份是一个好习惯,这可以避免你在弄错的情况下,面临一堆无法恢复的文件发愁。

参考资料:
1、Using Diff and patch
2、Diff比较两个文件夹
3、GNU Diff and patch


发布了140 篇原创文章 · 获赞 28 · 访问量 18万+

Supongo que te gusta

Origin blog.csdn.net/qq_16097611/article/details/80183573
Recomendado
Clasificación