Estoy buscando ejecutar un comando de Linux que comparará recursivamente dos directorios y generará solo los nombres de archivo de lo que es diferente. Esto incluye todo lo que está presente en un directorio y no en el otro o viceversa, y las diferencias de texto.
linux
command-line
diff
barfoon
fuente
fuente
diff
página de manual de CentOS 7 describe-q
como "informar solo cuando los archivos difieren", lo cual es menos claro que lo que escribió.-x PATTERN
comando para excluir ciertos subdirectorios. Por ejemplo,diff -qr repo1 repo2 -x ".git"
comparará dos directorios pero excluirá rutas de archivos con ".git" en ellos.También puedes usar rsync
fuente
--size-only
extrañará archivos de tamaño idéntico pero contenido diferente, por ejemplo, viejo / version.txt "29a" nuevo / version.txt "29b" . Utilice en su lugar:rsync -ric --dry-run old/ new/
donde el argumento "-i" permite obtener la lista de archivos directamente a través dersync -ric --dry-run old/ new/ | cut -d" " -f 2
Si desea obtener una lista de archivos que están solo en un directorio y no sus subdirectorios y solo sus nombres de archivo:
Si desea enumerar recursivamente todos los archivos y directorios que son diferentes con sus rutas completas:
De esta manera, puede aplicar diferentes comandos a todos los archivos.
Por ejemplo, podría eliminar todos los archivos y directorios que están en dir1 pero no dir2:
fuente
En mi sistema Linux para obtener solo los nombres de archivo
fuente
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
funciona bien para mi!El enfoque de ejecución
diff -qr old/ new/
tiene un inconveniente importante: puede faltar archivos en directorios recién creados. Por ejemplo, en el ejemplo a continuación, el archivodata/pages/playground/playground.txt
no está en la salida,diff -qr old/ new/
mientras que el directorio sí lodata/pages/playground/
está (busque playground.txt en su navegador para compararlo rápidamente). También publiqué la siguiente solución en Unix y Linux Stack Exchange , pero también la copiaré aquí: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 perderían 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
diff new/ old/
) para ver qué directorios se eliminaron?diff -qr new/ old/
en el ejemplo anterior con los tars dokuwiki produce el mismo resultado quediff -qr old/ new/
, es decir, ve que el directorio es nuevo / falta pero no los archivos en élfuente