Tengo (bueno, tenía ) un directorio:
/media/admin/my_data
Tenía aproximadamente 49 GB de tamaño y tenía decenas de miles de archivos. El directorio es el punto de montaje de una partición LUKS activa.
Quería cambiar el nombre del directorio a:
/media/admin/my_data_on_60GB_partition
No me di cuenta en ese momento, pero emití el comando desde el directorio de inicio, así que terminé haciendo:
~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Entonces, el mv
programa comenzó a moverse /media/admin/my_data
y su contenido a un nuevo directorio ~/my_data_on_60GB_partition
.
Solía Ctrl+ Cpara cancelar el comando a mitad de camino, así que ahora tengo un montón de archivos divididos en directorios:
~/my_data_on_60GB_partition <--- about 2GB worth files in here
y
/media/admin/my_data <---- about 47GB of orig files in here
El nuevo directorio ~/my_data_on_60GB_partition
y algunos de sus subdirectorios son propiedad de root.
Supongo que el mv
programa debe haber copiado los archivos como root inicialmente y luego, después de la transferencia chown
, los ha devuelto a mi cuenta de usuario.
Tengo una copia de seguridad algo antigua del directorio / partición.
Mi pregunta es, ¿ es posible restaurar de manera confiable el grupo de archivos que se movieron?
Es decir, ¿puedo simplemente ejecutar:
sudo mv ~/my_data_on_60GB_partition/* /media/admin/my_data
¿O debería dejar de intentar recuperarme, ya que los archivos están posiblemente dañados y parcialmente completos, etc.?
- SO - Ubuntu 16.04
mv --version
mv (GNU coreutils) 8.25
fuente
Control-Z
(pausar) en lugar de hacerloControl-C
. En este caso, podrá ver qué archivo se estaba transfiriendo en ese momento y saber qué archivo se copió solo parcialmente. Luego puede decidir con calma cómo proceder. (Usarkill -stop
para procesos que no están en el tty).(2GB + 47GB) < 60GB
. la capacidad de partición es de 60 GB, el tamaño de la carpeta y su contenido: 49 GB.Respuestas:
Al mover archivos entre sistemas de archivos,
mv
no elimina un archivo antes de que termine de copiarlo, y procesa los archivos secuencialmente (inicialmente dije que copia, luego elimina cada archivo a su vez, pero eso no está garantizado; al menos lasmv
copias GNU luego eliminan cada comando) argumento de línea a su vez, y POSIX especifica este comportamiento ). Por lo tanto, debe tener como máximo un archivo incompleto en el directorio de destino, y el original seguirá estando en el directorio de origen.Para mover las cosas hacia atrás, agregue la
-i
bandera paramv
que no sobrescriba nada:(suponiendo que no tiene ningún archivo oculto desde el que restaurar
~/my_data_on_60GB_partition/
), o mejor aún (dado que, como descubrió, podría tener muchos archivos esperando ser eliminados), agregue la-n
bandera paramv
que no sobrescriba nada pero no preguntarte al respecto:También puede agregar la
-v
bandera para ver qué se está haciendo.Con cualquier compatible con POSIX
mv
, la estructura de directorio original aún debe estar intacta, por lo que también puede verificar eso, y simplemente eliminar/media/admin/my_data
... (Sin embargo, en el caso general, creo que lamv -n
variante es el enfoque seguro, maneja todas las formas demv
, incluyendo egmv /media/admin/my_data/* my_data_on_60GB_partition/
.)Probablemente necesite restaurar algunos permisos; puedes hacerlo en masa usando
chown
ychmod
, o restaurarlos desde copias de seguridad usandogetfacl
ysetfacl
(gracias a Sato Katsura por el recordatorio ).fuente
find
para buscar y establecer permisos. Hay muchos archivos en el nuevo directorio que tienen espacios en los nombres de archivo, pero no hay archivos ocultos, que yo sepa. ¿Crees que el globo en el comandosudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
expandiría el nombre de archivo sin problemas de división de palabras? Estaba pensando alternativamente que podría usarsudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/
lo que creo que manejaría las rutas de archivos con espacios.rsync
en su lugar, por lo que también verificaría la integridad de todos los archivos. Pero es bueno saber que no necesito eso.su command mv -i ...
(osu /bin/mv -i ...
), en lugar desudo mv -i ...
), en caso de que algún administrador (extraño) hiciera "mv" una función que hace "mv -f" en el nivel del sistema (es decir, / etc / profile o tales archivos de todo el sistema) ... Comando algo: inicie el comando algo, y no una función o alias del mismo nombre. (por ejemplo: uno podría ser (¡muy!) desafortunado y tener un (¡muy, muy malo!)function mv { /bin/mv -f -- "$@" }
en un archivo que siempre se obtiene, y luego "rm -i something" no preguntará nada (y solo protestará) "-i ! "archivo no existe) ... [he ver tales cosas ... tiritar ]Después de obtener la respuesta de Stephen Kitt y discutir este comando como una posible solución:
Decidí esperar a ejecutarlo hasta que entendí lo que estaba sucediendo, esta respuesta describe lo que descubrí y terminé haciendo.
Estoy usando Gnu
mv
que copia archivos al destino, luego solo si la operación de copia es exitosa, elimina el original.Sin embargo, quería confirmar si
mv
realiza esta secuencia un archivo a la vez, si eso fuera cierto, el contenido de la carpeta original se habría dividido limpiamente en dos partes, una parte desplazada al destino y la otra aún se queda en la fuente. Y posiblemente habría un archivo que se interrumpió durante la copia, lo que sería común entre los dos directorios, y probablemente tendría un formato incorrecto.Para descubrir archivos que eran comunes entre los dos directorios, ejecuté:
Este resultado sugirió que había 14,237 instancias de los mismos archivos en los directorios de origen y de destino, confirmé al verificar los archivos manualmente; sí, había muchos de los mismos archivos en ambos directorios. Esto sugiere que solo después de
mv
copiar grandes extensiones de archivos, se realiza la eliminación de los archivos de origen. Una búsqueda rápida eninfo
elmv
comando mostróNo ejecuté el comando pero sospecho que si intenté ejecutar
La
-i
solicitud antes de sobrescribir probablemente se habría activado más de 14,000 veces.Entonces, para averiguar cuántos archivos totales hay en el directorio recién creado:
Entonces, si había un total de 14238 archivos regulares en el nuevo directorio y 14237 tenía originales idénticos en la fuente, eso significa que solo había un archivo en el nuevo directorio que no tenía un archivo idéntico correspondiente en la fuente. Para averiguar cuál era ese archivo, ejecuté rsync en la dirección de la fuente:
Una comprobación rápida confirmó que se trataba del archivo con formato incorrecto, donde el archivo existía tanto en el origen como en el destino, archivo de destino = 64 MB, original = 100 MB. Este archivo y su jerarquía de directorios todavía era propiedad de root y aún no se habían restaurado los permisos originales.
Entonces en resumen:
mv
nunca llegaron todavía están de vuelta en sus ubicaciones originales (obviamente)mv
copiaron completamente todavía tenían sus copias originales en el directorio fuenteEn otras palabras, todos los archivos originales todavía estaban intactos y la solución en este caso era simplemente eliminar el nuevo directorio.
fuente
-n
sería mejor en el caso general. Verifiqué elmv
código fuente, elimina la fuente un argumento a la vez.mv
hace la eliminación en la fuente. Entonces, ¿el comandomv foo bar baz
se moveríafoo
parabaz/foo
luego eliminar el original yfoo
luego moversebar
abaz/bar
...?cmp
lugar dediff
comparar archivos binarios. Además, su discusión anterior tiene sentido solo cuando mueve archivos a través de diferentes sistemas de archivos. No hay copia involucrada al mover archivos dentro del mismo sistema de archivos.Solo pensé en comentar que algunas personas pueden tener la tentación de tirar 'xargs' en la mezcla para ejecutar las cosas en paralelo. Eso me da los pelos de punta y realmente me gusta la solución rsync anterior.
En cuanto al material del sistema de archivos sobre mover y copiar y cuando se elimina exactamente el original, el VFS y el sistema de archivos subyacente se coordinan para garantizar la atomicidad por archivo antes de llegar a ese paso de eliminación. Entonces, incluso si se interrumpe antes de que el archivo de destino esté completamente escrito, todo el bloqueo en el VFS es realmente estricto y protege contra cosas como el intercalado de datos aleatorios incluso en casos paralelos. (Trabajé en Linux VFS y NFS4)
Agregar 'xargs' a la mezcla probablemente habría hecho que el paso de verificación de doble cordura fuera un dolor de cabeza, con múltiples archivos en medio del tránsito. Desearía tener más scripting de nivel de sistema. ¡Buenos recordatorios para mí!
Me encantó la pregunta, bueno para telarañas, y me hace amar rsync nuevamente. ¡Salud!
fuente