Verificar un directorio grande después de copiar de un disco duro a otro

Verificar un directorio grande después de copiar de un disco duro a otro

Tengo un servidor de archivos doméstico en el que uso Ubuntu.

Recientemente, uno de mis discos se llenó, así que compré otro y lo tiré allí.

Tengo una carpeta muy grande, el directorio tiene un tamaño aproximado de 1,7 T y contiene una cantidad decente de archivos.

solíaPCGCOPIAR los archivos del disco antiguo al nuevo y parece haber funcionado bien.

Ahora quiero validar el nuevo directorio en la nueva unidad con el directorio original en la unidad anterior antes de eliminar los datos de la unidad anterior para liberar espacio. Entiendo que puedo hacer una verificación CRC para hacer esto.

¿Cómo, específicamente, puedo hacer esto?

Respuesta1

Simplemente usaría el diffcomando:

diff -rq --no-dereference /path/to/old/drive/ /path/to/new/drive/

Esto lee y compara cada archivo en los árboles de directorios e informa cualquier diferencia. El -rindicador compara los directorios de forma recursiva mientras que -qsimplemente imprime un mensaje en la pantalla cuando los archivos difieren, en lugar de imprimir las diferencias reales (como lo hace con los archivos de texto). La --no-dereferencebandera puede ser útil si hay enlaces simbólicos que difieren, por ejemplo, en un directorio, un enlace simbólico, y en su directorio correspondiente, una copia del archivo al que se vinculó.

Si el diffcomando se imprimeninguna salida, eso significa que los árboles de directorios son idénticos; puede ejecutarlo echo $?para verificar que su estado de salida sea 0, lo que indica que ambos conjuntos de archivos son iguales.

No creo que calcular CRC o sumas de verificación sea particularmente beneficioso en este caso. Tendría más sentido si los dos conjuntos de archivos estuvieran en sistemas diferentes y cada sistema pudiera calcular las sumas de verificación para su propio conjunto de archivos, de modo que solo fuera necesario enviar las sumas de verificación a través de la red. Otra razón común para calcular sumas de verificación es conservar una copia de las sumas de verificación para uso futuro.

Respuesta2

sincronizaciónA menudo se usa para copiar archivos en lugar de gcp, pero también se puede usar para verificar una copia, independientemente de cómo se haya realizado. simplemente hazlo

rsync -niaHc /origfolder/ /copyfolder

Tenga cuidado de terminar el nombre de la primera carpeta (la fuente) con un archivo /. Las opciones son

  • -nno copiar (no hacer cambios)
  • -idetallar las diferencias
  • -apreservar (es decir, comparar ya que tenemos -n) permisos, propiedades, enlaces simbólicos, etc. y recurrir a directorios
  • -Hpreservar enlaces duros
  • -ccomparar sumas de verificación

El resultado muestra un código que detalla las diferencias para cada archivo o directorio que difiere. No hay salida si son iguales. El código tiene columnas YXcstpoguaxdonde cada carácter es un punto .si ese aspecto de la comparación está bien, o una letra:

Y is type of update: 
   < sent (not appropriate in this case)
   > need to copy 
   c missing file or directory
   h is hard link
   . no update
   * and rest of line is a message, eg *deleting
X file type: f file  d dir  L symlink  D device S special file
c checksum differs. + new item  " " same
s size differs
t timestamp differs
p permissions differ
o owner differ
g group differ
u (not used)
a acl differ
x extended attributes differ

Por ejemplo,

.d..t...... a/b/                    directory timestamp differs
cL+++++++++ a/b/d -> /nosuch2       symbolic link missing
cS+++++++++ a/b/f                   special file missing (a/b/f is a fifo)
>f..t...... a/b/ff                  file timestamp differs
hf          a/b/xx1 => a/b/xx       files should be a hard linked
cLc.t...... a/b/z -> /tmp/hi2       symbolic link to different name
cd+++++++++ a/c/                    directory missing
>f+++++++++ a/c/i.10                missing file needs to be copied

Consulte man rsynca continuación --itemize-changespara obtener más detalles. Si tiene diferencias en la tercera co cuarta scolumna, entonces tiene una corrupción de datos grave. Otras banderas, como diferentes permisos, propietarios o marcas de tiempo, pueden ser menos importantes para usted. Si todos los archivos están marcados como "faltantes", probablemente no haya proporcionado los directorios correctos para comparar. Si está seguro, ejecutar rsync sin la -nbandera "arreglará" las diferencias.

Respuesta3

Tenía la misma pregunta y uséla respuesta de antonio, con un poco de giro.

La aplicación directa de su respuesta fallará en caso de alguna falla de hardware (como un error de entrada/salida) que obligue a diff a salir.

Recopilé su respuesta, junto conesta respuesta, y ponerlo todo en esto:

find /path/to/original -type f -exec bash -c 'diff -rq --no-dereference "$@" "/path/to/destination/$(sed -r "s/^.*(<first-common-ancestor>.*)$/\1/g" <<<"$@")"' bash {} \;
  • Reemplace /path/to/originalcon la ruta del directorio original que copió.
  • Reemplace /path/to/destinationcon la ruta del directorio de destino en el que copió.
  • Reemplace <first-common-ancestor>con el directorio ancestral común entre ambos. Ejemplo: está copiando de /media/foo/bara /media/test/dst/, de modo que dst, una vez realizada la operación de copia, tenga el directorio bar. El primer ancestro común está baraquí; porque todos los archivos siguientes bartendrán la misma ruta relativa.

Algunas notas:

  • Las partes bash -cy bash {}deben realizar una sustitución segura del nombre de los archivos; para estar seguro de no sufrir daños con posibles ataques (como la elevación de privilegios).
  • La sedparte es eliminar la ruta absoluta del archivo encontrado y usar solo la ruta relativa (esto es diferente a usar execdir). Si no está seguro de la utilidad de esto, intente eliminarlo y verifique los mensajes de error :)
  • Leer <<<la variable como una cadena en lugar de leerla como una ruta a un archivo para leer.

información relacionada