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 A
y B
) que contienen los nombres de archivo en las carpetas A y B, respectivamente.
El paso de ejecución solicita cp
copiar la expansión de la A
matriz menos la B
matriz, todas con el prefijo, folderA
así como la expansión correspondiente de la B
matriz menos la A
matriz (todas con el prefijo folderB
) en folderC
.
Respuesta2
Una solución hacky usando diff
, sed
y 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 sed
para 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 xargs
y 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'