Encuentra archivos en un directorio no en otro

12

¿Hay alguna herramienta de Linux / Unix que encuentre todos los archivos en un directorio que no esté presente en otro? Básicamente estoy buscando diff que funciona en la salida de ls.

Los guiones cortos y dulces también son apreciados.

Willi Ballenthin
fuente

Respuestas:

20

diff ya hace esto:

diff dir1 dir2

Salida de ejemplo:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
tobym
fuente
55
Esto es bueno. Una queja: diff se está ejecutando en cada uno de los archivos que están en ambos. ¿Existe una opción oscura para simplemente ejecutar contra nombres de archivo (puede que me lo haya perdido)? De lo contrario, sugierodiff dir1 dir2 | grep "Only"
Willi Ballenthin
wow esto solo me ahorra muchos minutos de bash scripting gracias
user5359531
10

Golpetazo:

diff <(cd dir1; ls) <(cd dir2; ls)

Compare solo los nombres de archivo, no el contenido de los archivos.

Pausado hasta nuevo aviso.
fuente
También ksh y zsh.
Pausado hasta nuevo aviso.
use rsync para sincronizar
directorios
No analizar ls, usar finden su lugar!
Val dice reinstalar Mónica
4

Como la gente te dijo aquí, puedes usar DIFF en varias variaciones de uso. ¡O simplemente usa dirdiffen su lugar, lo que está destinado a lo que está intentando! :-)

Pero si quieres mantener algunos directorios sincronizados, entonces realmente deberías echarle un vistazo rsync.

Saludos

Ene.
fuente
3

Si desea hacer esto también a través de todos los subdirectorios, una buena forma de hacerlo es:

diff --brief -r dir1/ dir2/

Prefiero usar breve, pero puedes dejarlo fuera si quieres.

trueCamelType
fuente
1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done

James L
fuente
0

Esto funciona..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
Warner
fuente
0

no probado:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done
Javier
fuente
0

Dennis Williamson tuvo una buena respuesta , pero necesitaba hacerlo recursivamente. GNU findutils 4.7.0 no ordena su salida, así que esto es lo que usé

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

Para hacer esto solo de una manera, y producir una lista de archivos, usé esto:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

Para que esto funcione correctamente, ni $ dir1 ni $ dir2 deben incluir la barra diagonal final.

sondra.kinsey
fuente