¿Hay alguna manera de que pueda realizar una diferencia recursiva de dos directorios pero solo comparar (en sus respectivos lugares) archivos que coincidan con un nombre de archivo o predicado de tipo de archivo específico?
Por ejemplo, me gustaría hacer algo como
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... o mejor:
diff -r dir-a dir-b -filetype text
Claramente, no es obligatorio usarlo, diff
ya que supongo que es un encantamiento find
y -exec diff
también podría hacer el truco (simplemente no sé cómo generar las rutas de archivo complementarias en el último caso).
command-line
find
diff
Marcus Junius Brutus
fuente
fuente
Respuestas:
Shellscript
differ-r
Este shellscript puede realizar una diferencia recursiva de dos directorios, pero solo compara (en sus respectivos lugares) archivos que coinciden con un patrón de nombre de archivo o tipo de archivo específico.
Manifestación
Archivos:
Uso:
Corriendo
differ-r
:Las
diff
líneas de comando realizadas se imprimen con texto verde y la salida, cuando no hay coincidencia, se imprime con texto predeterminado (blanco sobre negro en la siguiente captura de pantalla).rsync
con filtroSi no necesita obtener ningún resultado que describa la diferencia, solo sepa qué archivos son diferentes o que faltan (por lo que
rsync
le gustaría copiarlos), puede usar la siguiente línea de comando.Manifestación
Si desea una salida limpia sin líneas de comentarios y sin directorios, puede hacer
grep
la salida de esta manera,Shellscript
rsync-diff
Esta línea única puede convertirse en el comando central de un shellscript
rsync-diff
.fuente
Como mencionó "Claramente, no es obligatorio usar diff",
Esto debería hacer el trabajo para que funden fácilmente configurable para qué tipo de tipos de archivos de ignorar:
además, otra alternativa sería escribir un script simple que se transfiera de una lista blanca a una lista negra y luego la lista negra se pasará al diff con la
--exclude
opción.fuente
Con la sustitución de comandos de soporte de shell , puede usar el siguiente one-liner (como ya señaló @JammingThebBits):
Funciona así:
find
busque los archivos que no le interesan,sed
extraiga el nombre base (la ejecuciónbasename
es extremadamente lenta si tiene muchos archivos) y los coloca en un archivo temporal ; dicho archivo se pasa adiff
decirle que los excluya de la comparación (doble exclusión = inclusión).Si no tiene sustitución de comando, coloque la
sed
salida en un archivo y páselo explícitamentediff
.En el ejemplo, busqué solo archivos XML y JAVA, cambiélos según sea necesario separándolos con OR.
fuente