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 diff
comando:
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 -r
indicador compara los directorios de forma recursiva mientras que -q
simplemente 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-dereference
bandera 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 diff
comando 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
-n
no copiar (no hacer cambios)-i
detallar las diferencias-a
preservar (es decir, comparar ya que tenemos-n
) permisos, propiedades, enlaces simbólicos, etc. y recurrir a directorios-H
preservar enlaces duros-c
comparar 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 YXcstpoguax
donde 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 rsync
a continuación --itemize-changes
para obtener más detalles. Si tiene diferencias en la tercera c
o cuarta s
columna, 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 -n
bandera "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/original
con la ruta del directorio original que copió. - Reemplace
/path/to/destination
con 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/bar
a/media/test/dst/
, de modo quedst
, una vez realizada la operación de copia, tenga el directoriobar
. El primer ancestro común estábar
aquí; porque todos los archivos siguientesbar
tendrán la misma ruta relativa.
Algunas notas:
- Las partes
bash -c
ybash {}
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
sed
parte es eliminar la ruta absoluta del archivo encontrado y usar solo la ruta relativa (esto es diferente a usarexecdir
). 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.