2010-01-07 27 views
210

Tengo dos directorios con la misma lista de archivos. Necesito comparar todos los archivos presentes en ambos directorios usando el comando diff. ¿Existe una opción de línea de comando simple para hacerlo, o tengo que escribir un script de shell para obtener la lista de archivos y luego iterar a través de ellos?Archivos Diff presentes en dos directorios diferentes

Respuesta

293

Usted puede utilizar el comando diff para ello:

diff -bur folder1/ folder2/ 

Esta es la salida de un diff recursivo que ignoran los espacios, con un marco unificado:

  • b bandera significa ignorar espacios en blanco
  • u bandera significa un contexto unificado (3 líneas antes y después)
  • r bandera significa recursivo
+4

En Windows, ¿qué es lo que se utiliza para hacer que el comando diff? – onmyway133

+8

Puede tener acceso al comando 'diff' al descargar [utilidades de GNU para Win32] (http://unxutils.sourceforge.net/). –

+6

También he encontrado que --opción brillante es útil; obtienes una lista de archivos modificados y puedes procesarlos por separado – Dariusz

9

diff no sólo se puede comparar dos archivos, puede, utilizando la opción -r, caminar árboles de directorios completos, comprobando de forma recursiva diferencias entre los subdirectorios y archivos que tienen lugar en momentos comparables en cada árbol.

$ man diff 

... 

-r --recursive 
     Recursively compare any subdirectories found. 

... 
16

Dif tiene una opción -r que está destinado a hacer precisamente eso.

diff -r dir1 dir2

3

Si se trata de GNU diff entonces sólo debe ser capaz de señalar que en los dos directorios y utilizar el -r opción.

De lo contrario, trate de usar

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done 

N. B. Como señaló Dennis en la sección de comentarios, en realidad no es necesario hacer la sustitución del comando en el ls. He estado haciendo esto durante tanto tiempo que estoy haciendo esto en piloto automático y sustituyendo el comando necesito obtener mi lista de archivos para comparar.

También olvidé agregar que hago '\ ls' para deshabilitar temporalmente mi alias de ls a GNU ls para que pierda la información de formato de color de la lista devuelta por GNU ls.

+2

No es necesario usar 'ls':' para i en./Dir1/* ' –

+1

@Dennis, atajo funky. +1. Estoy tan acostumbrado a hacer la sustitución de comandos aunque es automático y solo uso el comando que necesito, p. a veces estoy usando find. Usar ls también me permite jugar con el directorio que lista más, p. tiempo de inversión basado en lugar de la secuencia predeterminada. –

72

Si sólo está interesado en ver los archivos que difieren, puede utilizar:

diff -qr dir_one dir_two | sort 

opción "q" sólo mostrará los archivos que difieren, pero no el contenido que se diferencian, y "especie" se organizar la salida alfabéticamente.

+1

¡Es genial! También funciona de manera eficiente, es decir, si todo un subdirectorio existe solo en uno de los directorios, deja de repetirse en él e informa solo el subdirectorio en sí (sin su contenido sucesor). ¡¡muy agradable!! – SomethingSomething

+0

'-q' opción hombre !! te quiero. – Campa

0

Aquí hay una secuencia de comandos para mostrar las diferencias entre los archivos en dos carpetas. Funciona recursivamente Cambiar dir1 y dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/} $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2") 
0

Prueba esto:

diff -rq /path/to/folder1 /path/to/folder2  
+0

Esto duplica una respuesta existente y no agrega contenido nuevo. Por favor, no publique una respuesta a menos que realmente tenga algo nuevo para contribuir. –

Cuestiones relacionadas