Ejemplo
Supongamos que tengo 2 directorios a/
y b/
. Digamos que contienen los siguientes archivos:
a/
a/foo/1
a/bar/2
a/baz/3
b/
b/foo/1
b/bar/2
tales que a/foo/1
y b/foo/1
son idénticos pero a/bar/2
y b/bar/2
son diferentes.
Después de fusionarme a/
, b/
quiero obtener:
a/
a/bar/2
b/
b/foo/1
b/bar/2
b/baz/3
Explicación
a/foo/
yb/foo/
son (recursivamente) idénticos, por lo que eliminamosa/foo/
.a/bar/2
yb/bar/2
somos diferentes, por eso no hacemos nada.a/baz/
existe solo ena/
pero no enb/
, por lo que lo movemos ab/baz/
.
¿Existe un comando de shell listo para usar para esto? Tengo la sensación de que rsync
puede funcionar, pero no lo conozco rsync
.
Respuesta1
No puedo decir que conozca un comando en particular que pueda hacer esto por usted. Pero puedes lograr esto simplemente usando hash.
Ejemplo ingenuo a continuación:
#!/bin/bash
# ...some stuff to get the files...
# Get hashes for all source paths
for srcFile in "${srcFileList[@]}"
do
srcHashList+="$(md5sum "$srcFile")"
done
# Get hashes for all destination paths
for dstFile in "${dstFileList[@]}"
do
dstHashList+="$(md5sum "$dstFile")"
done
# Compare hashes, exclude identical files, regardless of their path.
for srci in "${!srcHashList[@]}"
do
for dsti in "${!dstHashList[@]}"
do
match=0
if [ "${srcHashList[$srci]}" == "${dstHashList[$dsti]}" ]
then
match=1
fi
if [ $match != 1 ]
then
newSrcList+=${srcFileList[$srci]}
newDstList+=${dstFileList[$dsti]}
fi
done
done
# ...move files after based on the new lists
Definitivamente, esto podría hacerse de manera más limpia, especialmente si solo le interesan archivos con rutas idénticas entre sí. Probablemente también podría hacerse en tiempo lineal, pero el concepto general funcionará.