Estoy tratando de encontrar los archivos existentes en un directorio pero no en el otro, intenté usar este comando:
diff -q dir1 dir2
El problema con el comando anterior en el que encuentra los archivos dir1
pero no dentro dir2
, así como los archivos dir2
pero no dentro dir1
,
Estoy tratando de encontrar los archivos dir1
pero no dir2
solo en ellos .
Aquí hay una pequeña muestra de cómo se ven mis datos
dir1 dir2 dir3
1.txt 1.txt 1.txt
2.txt 3.txt 3.txt
5.txt 4.txt 5.txt
6.txt 7.txt 8.txt
Otra pregunta en mi mente es ¿cómo puedo encontrar los archivos dir1
pero no dentro dir2
o dir3
en un solo comando?
grep
Por algo me gustaría^dir1
asegurarme de nodir1
aparecer más tarde en el camino.$4
como ejemplo. De hecho, en mi Ubuntu real, lasdiff
respuestas en italiano.$4
está bien para respuestas en italiano e inglés, pero no estoy seguro para todos los demás idiomas ...Esto debería hacer el trabajo:
Opciones explicadas (a través de la página man diff (1) ):
-r
- Compare recursivamente cualquier subdirectorio encontrado.-q
- Salida solo si los archivos difieren.fuente
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
opción: las páginas man solo dicen "Mostrar solo si los archivos son diferentes", no cómo comprueba si son diferentes. Leí el código fuente y descubrí que solo verifica los tamaños de archivo para determinar las diferencias, no el contenido real.-q
opción, no puedo reproducir que solo compruebe el tamaño del archivo. Usando GNU Diffutils 3.7 comparando dos archivos con el mismo tamaño de archivo pero diferente contenido condiff -q file1 file2
salidasFiles file1 and file2 differ
.Este comando le dará archivos que están en dir1 y no en dir2.
Sobre el
<( )
signo, puede buscarlo en Google como 'sustitución de proceso'.fuente
(ls -R dir1|sort)
podría hacer el truco(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
Una buena manera de hacer esta comparación es usar
find
conmd5sum
, luego adiff
.Ejemplo:
Use
find
para enumerar todos los archivos en el directorio, luego calcule el hash md5 para cada archivo y canalícelo a un archivo:Realice el mismo procedimiento para el otro directorio:
Luego compare el resultado dos archivos con "diff":
Esta estrategia es muy útil cuando los dos directorios a comparar no están en la misma máquina y debe asegurarse de que los archivos sean iguales en ambos directorios.
Otra buena forma de hacer el trabajo es usar git
¡Atentamente!
fuente
Meld ( http://meldmerge.org/ ) hace un gran trabajo al comparar directorios y los archivos que contiene.
fuente
El complemento DirDiff de vim es otra herramienta muy útil para comparar directorios.
No solo enumera qué archivos son diferentes entre los directorios, sino que también le permite inspeccionar / modificar con vimdiff los archivos que son diferentes.
fuente
Insatisfecho con todas las respuestas, dado que la mayoría de ellas funcionan muy lentamente y producen resultados innecesariamente largos para directorios grandes, escribí mi propio script de Python para comparar dos carpetas.
A diferencia de muchas otras soluciones, no compara el contenido de los archivos. Además, no va dentro de subdirectorios que faltan en otro directorio. Por lo tanto, el resultado es bastante conciso y el script funciona rápido.
Uso de la muestra:
O si desea ver solo los archivos del primer directorio:
PD: si necesita comparar tamaños de archivo y hashes de archivos para posibles cambios, publiqué un script actualizado aquí: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
fuente
Otro enfoque (quizás más rápido para directorios grandes):
El
sed
comando elimina el primer componente del directorio gracias a la publicación de Erik )fuente
find
tanto, un comentario y no una respuesta por separado):cd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
esto imprimirá los archivos presentes en dir2 pero no en dir1.Esto es un poco tarde pero puede ayudar a alguien. No estoy seguro de si diff o rsync escupen solo nombres de archivo en un formato simple como este. Gracias a plhn por dar esa buena solución que amplié a continuación.
Si desea solo los nombres de archivo, por lo que es fácil copiar los archivos que necesita en un formato limpio, puede usar el comando find.
Esto supone que tanto dir1 como dir2 están en la misma carpeta principal. sed simplemente elimina la carpeta principal para que pueda comparar manzanas con manzanas. El último sed simplemente devuelve el nombre dir1.
Si solo quieres archivos:
Del mismo modo para directorios:
fuente
cd
antes de que elfind
lugar de tener que utilizarsed
, por ejemplo:comm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. (Losexit
s están aquí para evitar elfind
uso del directorio actual deberíancd
fallar)comm
con soporte-z
(vino con git.savannah.gnu.org/cgit/coreutils.git/commit/… ) puede hacerlocomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
. (Mientras tanto, también descubrí que losexit
s podrían ser reemplazados.)La respuesta aceptada también mostrará una lista de los archivos que existen en ambos directorios, pero que tienen contenido diferente. Para enumerar SOLO los archivos que existen en dir1 puede usar:
Explicación:
fuente
Esta respuesta optimiza una de las sugerencias de @ Adail-Junior al agregar la
-D
opción, que es útil cuando ninguno de los directorios que se comparan son repositorios git:Si usa,
-D
entonces no verá comparaciones con/dev/null
:text Binary files a/whatever and /dev/null differ
fuente
Una forma simplificada de comparar 2 directorios con el comando DIFF
abrir filename.dat después de que se complete la ejecución
y verá: Solo en nombre de archivo.1: nombre de archivo.2 Solo en: nombre_de_directorio: nombre_de_archivo1 Solo en: nombre_de_directorio: nombre_de_archivo2
fuente
Este es el script bash para imprimir comandos para sincronizar dos directorios
fuente
GNU
grep
puede invertir la búsqueda con la opción-v
. Esto hacegrep
que el informe de las líneas, que no coinciden. Con esto, puede eliminar los archivosdir2
de la lista de archivosdir1
.Las opciones le
-F -x
indicangrep
que realice una búsqueda de cadena en toda la línea.fuente