Ejemplo

Ejemplo

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/1y b/foo/1son idénticos pero a/bar/2y b/bar/2son 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/y b/foo/son (recursivamente) idénticos, por lo que eliminamos a/foo/.
  • a/bar/2y b/bar/2somos diferentes, por eso no hacemos nada.
  • a/baz/existe solo en a/pero no en b/, por lo que lo movemos a b/baz/.

¿Existe un comando de shell listo para usar para esto? Tengo la sensación de que rsyncpuede 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á.

información relacionada