Estoy usando CentOS 5.5 y me gustaría mover una gran cantidad de carpetas dentro de un volumen , conservando su mtime
.
La mejor solución que pude encontrar es así:
cp -p -r source/data target/
rm -rf source/data
Con más de 1 TB de datos en un recurso compartido NFS, la copia lleva una eternidad. No quiero copiar Quiero un movimiento instantáneo
Cuando muevo una carpeta usando mv source/data target/
, la mtime
carpeta (no los archivos) se configura a la hora actual. Esto se debe a que esta operación modifica el contenido de la carpeta que estoy moviendo (la ..
entrada apunta a un inodo diferente).
Se me ocurrió un siguiente script de shell que llamé mv_preserve_mtime.sh
:
#!/bin/bash
# Moves source folder to target folder.
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2
Bueno, eso tampoco funcionó. La carpeta mtime
se restaura, pero todas las carpetas dentro de la carpeta que muevo (solo las de 1 nivel de profundidad) se mtime
restablecen por razones que no entiendo.
¿Alguien tiene una solución adecuada, eficiente y correcta?
touch
no funcionó. ¿Es elmv
paso o eltouch
paso que cambia el tiempo m de los subdirectorios? ¿Qué sistema operativo está en el servidor NFS y (si lo sabe) qué tipo de sistema de archivos?mv
paso que causa problemas. El servidor NFS es en realidad un almacenamiento de NetApp, no sé prácticamente nada sobre sus componentes internos.touch
lo contrario debería haber funcionado. Por cierto, sería una forma más portátiltouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
no era portátil.Respuestas:
POSIX
mv
no proporciona ninguna opción para solicitar la preservación de atime / mtime, pero como la operación es local en un mismo volumen, puede solicitar elcp
uso de enlaces duros en lugar de copiar datos de los archivos normales utilizando la-l
opción:Dado que solo se copiarán directorios y referencias de archivos, debería ir mucho más rápido:
Para obtener más información sobre enlaces duros, puede consultar la página de Wikipedia correspondiente
En cuanto a por qué los subdirectorios mtime se restablecen con su solución actual, es porque solo obtiene y restaura el directorio primario mtime: touch no es un comando recursivo.
fuente
mv
no tiene la opción "recursiva", descender a subdirectorios solo se hace si se necesita una copia real (volúmenes diferentes, por ejemplo).mv
en un directoriodata
, yo simplemente cambio el..
en eldata
contenido 's y modificar lassource
y lostarget
directorios a la lista el elemento movido correctamente. Ningún otro directorio necesitaría ser tocado.rename
medida de la implementación de syscall subyacente por parte del kernel y los sistemas de archivos utilizados, NFS agrega su parte al problema. Hay algunos indicadores que hacen referencia a este tipo de inconsistencias: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…Otra solución puede ser:
fuente