it-swarm-es.com

¿Cómo hago solo los duplicados de print diff?

Estoy tratando de averiguar qué archivos están presentes en dos carpetas comparadas. Solo estoy interesado en comparar nombres de archivos.

Agregar -s al comando no hace el truco por alguna razón. Quiero reutilizar la lista para eliminar duplicados y eliminar las líneas que dicen "Solo en" es una pérdida de tiempo.

Mando:

diff -s /folder1/folder1 /folder2/folder2

Salida:

Only in /folder1/folder1: sth.pdf
Only in /folder1/folder1: sth.png
Only in /folder1/folder1: sth.txt
Files /folder1/folder1/sthe.txt and /folder2/folder2/sthe.txt are identical
Only in /folder1/folder1: sth.pdf
Only in /folder1/folder1: sth.png
Only in /folder1/folder1: sth.txt
.
.
.

¿Alguna sugerencia?

2
treakec

Solo estoy interesado en comparar nombres de archivos.

Luego, evite cualquier herramienta que compare el contenido de los archivos, ya que solo ralentizará el proceso.

Lo que se me ocurre en este momento para comparar los nombres de archivo en los dos directorios y generar solo los comunes es:

comm -12 <(cd dir1; stat -c '%n' *) <(cd dir2; stat -c '%n' *)
  • comm -12 <([...]) <([...]): comparará la salida de [...] y [...] solo mostrará las líneas presentes en ambos archivos;
  • cd dirN; stat -c '%n' * cambiará el directorio de trabajo actual a dirN y generará una lista ordenada de los nombres de los archivos que contiene.
% tree
.
├── dir1
│   ├── file1
│   ├── file2
│   └── file3
└── dir2
    └── file1

2 directories, 4 files
[email protected] ~/tmp % comm -12 <(cd dir1; stat -c '%n' *) <(cd dir2; stat -c '%n' *)
file1

Si necesita lidiar con nuevas líneas en los nombres de archivo, use esto en su lugar:

sort -z <(cd dir1; stat --printf '%n\0' *) <(cd dir2; stat --printf '%n\0' *) | uniq -zd | tr '\0' '\n'
  • sort -z <([...]) <([...]): unirá y ordenará la salida de [...] y [...];
  • cd dirN; stat -c '%n' * cambiará el directorio de trabajo actual a dirN y generará una lista ordenada de los nombres de los archivos que contiene;
  • uniq -zd: imprimirá solo líneas duplicadas;
  • tr '\0' '\n' reemplazará los caracteres NUL con nuevas líneas.
% tree 
.
├── dir1
│   ├── file1
│   ├── file2
│   └── file3
└── dir2
    └── file1

2 directories, 4 files
% sort -z <(cd dir1; stat --printf '%n\0' *) <(cd dir2; stat --printf '%n\0' *) | uniq -zd | tr '\0' '\n'
file1
2
kos