¿Cómo diferenciar los nombres de archivo en dos directorios (sin escribir en archivos intermedios)?

31

Estoy tratando de hacer algo en la línea de:

diff `ls -1a ./dir1` `ls -1a ./dir2`

Pero eso no funciona por razones obvias. ¿Hay una mejor manera de lograr esto (en 1 línea) que esta?

ls -1a ./dir1 > lsdir1
ls -1a ./dir2 > lsdir2
diff lsdir1 lsdir2

Gracias

bguiz
fuente

Respuestas:

47

Estabas cerca En bash, desea la sustitución del proceso , no la sustitución del comando:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)
Ignacio Vazquez-Abrams
fuente
Sin embargo, la sustitución del proceso no es necesaria. ¡La respuesta a continuación ( superuser.com/a/228773/566289 ) está en punto!
Jan D
¡Excepto que la respuesta difiere el contenido, no los nombres de archivo!
perdido el
10
diff -rq dir1 dir2

usando la opción -r, recorra árboles de directorios completos, verificando recursivamente las diferencias entre subdirectorios y archivos que ocurren en puntos comparables en cada árbol. El truco es usar la opción -q para suprimir las comparaciones línea por línea

fseto
fuente
3
@festo: No te faltará el punto de esta pregunta, en realidad no quiero diferenciar el contenido de los archivos, quiero diferenciar la salida de los lscomandos
bguiz
+1, en realidad, obtuve el mismo resultado con la advertencia, diff -rq informó un archivo vinculado como 'No existe tal archivo o directorio'. Entonces, más uno para un uso correcto y francamente más simple. (incluso si la respuesta de IVA es una mejor 'oportunidad de aprendizaje' para la sustitución de procesos (> _ <)
xtian
1
Esto es mucho más lento que diferenciar los nombres de los archivos: la totalidad de cada archivo debe leerse y compararse.
Zaz
@ Josh, por supuesto, porque lo hace de forma recursiva ...
Braiam
1
@Braiam: Incluso si difiere recursivamente los nombres de los archivos (usando rsyncla --dry-runopción, por ejemplo), aún sería mucho más rápido que diff -r.
Zaz