¿Cómo creo una lista de archivos modificados mediante programación usando las herramientas de línea de comandos de Linux? No me interesa la diferencia en ningún archivo en particular (delta, parche). Solo quiero tener una lista de archivos nuevos o modificados en comparación con la versión anterior del producto. Para poder publicar una nueva actualización del producto.
actualización: diff -qr
no produce resultados muy convenientes. La salida de diff -qr
también necesita ser procesada. ¿Hay alguna forma mejor?
linux
bash
command-line
diff
Alfa Sísifo
fuente
fuente
Respuestas:
Tengo un enfoque simple para esto: use el modo de vista previa rsync:
Los archivos que se muestran como "para ser eliminados" por ese comando serán los archivos "nuevos". Los otros que serán transferidos han cambiado de alguna manera. Consulte la página de manual de rsync para obtener más detalles.
fuente
Puede usar el diff toool: vea las opciones -q y -r
Ejemplo:
fuente
Only in
lo que aparece incluso si los directorios son copias ideales. Tenía que comparar los cambios con una revisión anterior y terminar descargando la revisión completa en un directorio separado y usar herramientas SVN estándar para comparar. Ese parece ser el único camino a seguir ...El
diffutils
paquete incluye unalsdiff
herramienta. Simplemente pase la salida dediff -u
a lsdiff:fuente
patchutils
paquete para mí (CentOS 5.x).Simplemente tocaría un archivo en el momento de cada actualización, y luego puede encontrar archivos que se modificaron desde entonces con
find /tree/location -newer /last/update/file -print
fuente
Para tomar solo el nombre de los archivos que cambiaron, utilizo este comando:
Si necesita excluir algunos archivos como archivos de objetos o archivos de biblioteca, puede usar:
fuente
Para crear una lista de archivos nuevos o modificados mediante programación, la mejor solución que se me ocurre es usar rsync , sort y uniq :
Permítanme explicar con este ejemplo: queremos comparar dos versiones de dokuwiki para ver qué archivos se cambiaron y cuáles se crearon recientemente.
Buscamos los tars con wget y los extraemos en los directorios
old/
ynew/
:Ejecutar rsync de una manera puede perder archivos recién creados como se muestra aquí en la comparación de rsync y diff:
produce el siguiente resultado:
Al ejecutar rsync solo en una dirección, se pierden los archivos recién creados y, al revés, se pierden los archivos eliminados, compare la salida de diff:
produce el siguiente resultado:
Ejecutar rsync en ambos sentidos y ordenar la salida para eliminar duplicados revela que el directorio
data/pages/playground/
y el archivodata/pages/playground/playground.txt
se perdieron inicialmente:produce el siguiente resultado:
rsync
se ejecuta con estos argumentos:-r
"recurrir a directorios",-c
para comparar también archivos de tamaño idéntico y solo "omitir en función de la suma de comprobación, no de mod-time & size",-n
para "realizar una ejecución de prueba sin realizar cambios", y--out-format="%n"
"generar actualizaciones utilizando el FORMATO especificado", que es "% n" aquí solo para el nombre del archivoLa salida (lista de archivos) de
rsync
en ambas direcciones se combina y ordena usandosort
, y esta lista ordenada se condensa eliminando todos los duplicados conuniq
fuente
Debería obtener el resultado deseado usando:
fuente
Esto podría hacer el truco:
fuente
Normalmente coloca los archivos en algún tipo de sistema de control de versiones como SubVersion o git, ya que pueden hacer esto por usted de inmediato.
Pero podría hacer un script rápido con un bucle for en dir1 y luego comparar cada archivo con el de dir2. El bucle for puede mirar el código de salida de diff para saber si los archivos eran diferentes.
Tal vez algo como esto:
Nota: El script no se prueba, por lo que el ejemplo anterior es "pseudocódigo inspirado en bash" ...
Vayamos otra vez pero con git
Crea algunos archivos de ejemplo para jugar
Luego ingrese el directorio e importe dir1
Salga y modifique dir1 (para que se convierta en su dir2)
Luego vaya al directorio git e importe el nuevo directorio
Ahora pregúntale a git qué ha cambiado (con el comando de estado)
El resultado es una lista con los cambios, que se ve así:
fuente
Tal vez estarías más feliz con algo diferente. Tratar
git
.Haz esto como un ejemplo:
git
rastreará sus archivos por usted. El comandogit status
le mostrará todos los archivos que se han modificado desde la última confirmación.fuente
Esto es similar a rsync: muestra cuándo se sobrescribirá el archivo más nuevo en el destino (se solicita más adelante, aunque no es un duplicado).
Como se indica en la pregunta, "diff -q -r" puede requerir algún procesamiento para ser útil. La pregunta no especificaba la forma de la salida; Las respuestas dan diferentes tipos de informes.
rsync
es una herramienta útil para este propósito porque es mucho más rápido quediff
. Sin embargo, la solución sugerida por @nils es mucho más detallada (y enumera más archivos) que las diferencias reales entre los árboles de directorio antiguos / nuevos. Por ejemplo, comparando eso con el script que escribí para esa respuesta y ejecutándome con los mismos datos,Para dar
diff
cuenta adecuada de los nuevos archivos, también necesita la-N
opción (que no veo en ninguna de las respuestas sugeridas). Sin embargo, dado que es mucho más lento (órdenes de magnitud) quersync
, mejorar el rendimiento de este último parece el camino a seguir.Otras lecturas
fuente
Siempre he sido parcial a sha1sum (o incluso md5sum; en este contexto es bastante seguro).
A veces, como si se cambian los nombres o se mueven demasiados archivos, ordenar en el primer campo y luego hacer la diferencia podría ayudar, pero la mayoría de las veces esto es lo suficientemente bueno.
Tenga en cuenta que, en comparación con algunos de los otros métodos, esto tiene la ventaja de que no necesita guardar una copia de los archivos "anteriores"; solo el archivo de salida md5sum.
fuente