Copiar archivos de resultados de diferencias

Copiar archivos de resultados de diferencias

Tengo dos carpetas: Carpeta A y Carpeta B.

Comparé los archivos de ambas carpetas usando el comando diff. Ahora, después de descubrir que ciertos archivos solo están disponibles en la carpeta A y ciertos archivos en la carpeta B, me gustaría copiar esos archivos distintivos de ambas carpetas en una carpeta llamada carpeta C que ahora tendrá todos los archivos únicos de A y B.

¿Cómo puedo hacer esto?

Respuesta1

Podrías usarFunciones de resta de matrices y expansión de llaves de zsh, al igual que:

Configuración:

$ tree .
.
├── folderA
│   ├── file0
│   ├── file1
│   └── file2
├── folderB
│   ├── file2
│   ├── file3
│   └── file4
└── folderC

3 directories, 6 files


cd folderA
A=(*)
cd ../folderB
B=(*)
cd ..

Ejecución:

cp folderA/${^A:|B} folderB/${^B:|A} folderC

Resultado:

$ tree folderC
folderC
├── file0
├── file1
├── file3
└── file4

0 directories, 4 files

Los dos pasos de configuración crean matrices (con nombre Ay B) que contienen los nombres de archivo en las carpetas A y B, respectivamente.

El paso de ejecución solicita cpcopiar la expansión de la Amatriz menos la Bmatriz, todas con el prefijo, folderAasí como la expansión correspondiente de la Bmatriz menos la Amatriz (todas con el prefijo folderB) en folderC.

Respuesta2

Una solución hacky usando diff, sedy xargs:

Configuración de prueba:

$ mkdir folderA folderB folderC
$ touch folderA/fi\ le1 folderA/file2 folderA/file3 folderB/file3 folderB/file4
$ diff -rq folderA folderB
Only in folderA: fi le1
Only in folderA: file2
Only in folderB: file4

Ahora usamos sedpara filtrar todas las líneas que comienzan con cadena Only in folderA:y cambiamos esta parte para folderA/formar un nombre de archivo relativo con comillas ( 'folderA/fi le1'). Luego, esta cadena se canaliza xargsy se utiliza para copiar este archivo folderC.

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderA\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderA/fi le1' -> 'folderC/fi le1'
'folderA/file2' -> 'folderC/file2'

Lo mismo que arriba para folderB:

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderB\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderB/file4' -> 'folderC/file4'

información relacionada