¿Cómo mover una carpeta en Linux que conserva su mtime?

12

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 mtimecarpeta (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 mtimese restaura, pero todas las carpetas dentro de la carpeta que muevo (solo las de 1 nivel de profundidad) se mtimerestablecen por razones que no entiendo.

¿Alguien tiene una solución adecuada, eficiente y correcta?

Roman Zenka
fuente
Me pregunto por qué su intento con touchno funcionó. ¿Es el mvpaso o el touchpaso 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?
Gilles 'SO- deja de ser malvado'
@Gilles: No sé por qué está sucediendo. Es el mvpaso que causa problemas. El servidor NFS es en realidad un almacenamiento de NetApp, no sé prácticamente nada sobre sus componentes internos.
Roman Zenka
1
Gracias. Sospecho que es una rareza de NetApp. De touchlo contrario debería haber funcionado. Por cierto, sería una forma más portátil touch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp.
Gilles 'SO- deja de ser malvado'
@Gilles: Muy interesante, no me di cuenta de que statno era portátil.
Roman Zenka

Respuestas:

15

POSIX mvno 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 el cpuso de enlaces duros en lugar de copiar datos de los archivos normales utilizando la -lopción:

cp -p -r -l source/date target/
rm -rf source/data

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.

Eureka
fuente
El mtime es más complicado que eso. Solo el directorio padre y los directorios directamente debajo de él han cambiado mtime. Todos los demás directorios siguen siendo los mismos. Uno esperaría que se cambiara cada directorio, o solo el padre.
Roman Zenka
1
En realidad, tiene sentido: 1) El directorio padre tiene el mtime bueno porque se estableció explícitamente al tocarlo, 2) Las entradas del directorio se recrearon con el directorio padre, pero su mtime no se restauró manualmente (estructura de directorio Unix y formato de inodo) 3) El resto de la estructura de árbol no se cambió realmente, ya que permanecimos en el mismo volumen: por eso mvno tiene la opción "recursiva", descender a subdirectorios solo se hace si se necesita una copia real (volúmenes diferentes, por ejemplo).
Eureka
@Eureka: Buena explicación, pero ¿por qué se hace de esta manera? Si tuviera que poner en práctica mven un directorio data, yo simplemente cambio el ..en el datacontenido 's y modificar las sourcey los targetdirectorios a la lista el elemento movido correctamente. Ningún otro directorio necesitaría ser tocado.
Roman Zenka
1
@Roman Zenka Después de algunas búsquedas, este comportamiento parece estar bastante poco definido entre Unices y los sistemas de archivos y depende en gran renamemedida 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/…
Eureka
@Eureka: Me resulta extremadamente difícil creer que algo que consideraría tan básico puede ser un desastre. Es casi 2011. ¡Gracias por esos recursos!
Roman Zenka
4

Otra solución puede ser:

rsync -a --remove-source-files source / data target /

Genjo
fuente
Esto no parece funcionar en macOS.
Lenar Hoyt