Rsync: copia solo sobre marcas de tiempo


42

Actualmente tengo dos directorios A / y B / que son idénticos en todos los aspectos, con la excepción de las marcas de tiempo. Por lo tanto, si ejecuto el comando:

rsync --dry-run -crvv A/ B/

entonces todos los archivos están marcados "uptodate", mientras que el comando:

rsync --dry-run -rvv A/ B/

muestra que todos los archivos deben copiarse de A / a B /.

Mi pregunta es la siguiente: dado que sé que los archivos son idénticos (con respecto al contenido), entonces ¿hay alguna manera (a través de rsync o de otra manera) para configurar las marcas de tiempo para los archivos en B / para que sean idénticas a las marcas de tiempo de los archivos en A /, sin copiar todos los archivos de A / a B /?

Gracias


Si sabe que los archivos son idénticos, ¿por qué debe hacer todo lo posible para no copiarlos para obtener la marca de fecha / hora que necesita?
Tim

3
@Tim: tal vez hay muchos datos.
Richard

Respuestas:


75

Usando -t(preservar marcas de tiempo) y --size-onlysolo comparará archivos en tamaño. Si el tamaño coincide, rsync no copiará el archivo, pero como -tse especifica, actualizará la marca de tiempo en el archivo de destino sin volver a copiarlo.

Asegúrese de no usar -u(actualizar) ya que esto omitirá los archivos que ya existen y omitirá por completo la actualización de la marca de tiempo.

Originalmente tuve el problema de no usar rsync para copiar un montón de archivos en una nueva unidad y, por lo tanto, las marcas de tiempo se actualizaron a la hora actual. Utilicé el siguiente comando para sincronizar todo correctamente en un período de tiempo decente:

rsync -vrt --size-only /src /dest

2
También sugiero agregar --existingpara evitar copias accidentales de nuevos archivos.
Leden

1
La bandera --archive(o -a) incluye -r, -ty más :)
Dor

6

El uso de --size-only hará que rsync omita la comparación de las marcas de tiempo del archivo (y, por lo tanto, el contenido del archivo) si los tamaños coinciden. La combinación de esto con --times clonará las marcas de tiempo en el árbol de destino.


3

Creo que rsync es la herramienta adecuada para hacer esto, pero si desea que algún script haga esto, algo puede ser un buen comienzo.

Puede obtener una lista de archivos con marcas de tiempo (tiempos de acceso) como esta:

find . -printf '"%p" %a\n' -type f > /tmp/times

Y obtenga los comandos de actualización de tiempo apropiados:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

¡No es un guión completo, pero es un buen lugar para comenzar! :)


Gracias. Creo que probablemente me quedaré con Rsync por el momento, pero definitivamente iré a la web y aprenderé los diferentes componentes de su script, ya que puede ser útil en el futuro.
artella

¡Esa parecía ser exactamente mi solución! Quiero preservar los tiempos mientras agrego algunos metadatos a mi biblioteca de música. Sin embargo, aparentemente no puede manejar espacios en los nombres de archivo):
Burcardo

2

Utilice el directorio de origen (p /path/to/source. Ej. ) Como referencia para el comando táctil. Solo cda su directorio de destino y hacer

find -type f -exec touch -r /path/to/source/{} {} \;

No puede copiar marcas de tiempo de menos de un segundo con rsync (todavía).

Esto también funciona para directorios y pseudo archivos (simplemente elimine o cambie el -type f)


Esto fue útil para mí, ya que necesitaba un tiempo para ser copiado. Noté que no copia ctime, lo cual estaba bien en mi caso.
snapfractalpop

Solo lea la página de manual de 'touch'. Puede configurar atime y mtime con este comando.
knorke

Sí, sé que puedes usarlo, touch -arpero eso aún no cambia el ctime. Supongo que rara vez se desea.
snapfractalpop

Ah, veo el problema ahora. Gracias. Sí, ctime es difícil de cambiar y no sé por qué.
knorke

1

Bueno, ciertamente podría escribir un script que lea la marca de tiempo de un lado y luego use el tacto para configurarlo en el mismo archivo del otro lado.

Pero eso probablemente le llevará mucho más tiempo que simplemente dejar que rsync intente copiar todos los archivos. En realidad, se transferirán muy pocos datos (solo bloquean los hash si los archivos son realmente idénticos). Pero el contenido completo de cada archivo tendrá que leerse en cada lado al menos. Entonces, está limitado por el ancho de banda del disco o IOPS, podría tomar un tiempo. Pero probablemente todavía menos tiempo que escribir y probar un guión para hacerlo.


Gracias, no estaba al tanto de esta característica de rsync (también se discute en wikipedia).
artella

0

Para personas como yo que tienen la intención de modificar los archivos y desean conservar la marca de tiempo original (por ejemplo, actualizan las metaetiquetas de su biblioteca de música).

Se basa en la solución proporcionada por Stone. Sin embargo, aquí sobre el tiempo de modificación y un script de trabajo para restaurar las marcas de tiempo. PRIMERO haga el primer paso, luego comience a trabajar con sus archivos.

  1. Preserve las marcas de tiempo antiguas . Funciona desde el directorio actual, excluye todos los archivos ocultos y lo guarda en el archivo temporal en /tmp/files. Siempre puede cambiar los parámetros, pero es mejor quedarse con él -printf '"%t" "%p"\n'ya que el touchcomando posterior lo utiliza.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Modifica tus archivos tanto como quieras

  3. ahora cree un archivo que lo ayude a restaurar las marcas de tiempo:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. Y finalmente aplique las fechas antiguas a los archivos modificados

    sh job.sh

Advertencia: funciona para archivos con espaciado de nombres, caracteres especiales, pero por ejemplo no hay archivos con un $signo en él.


Para evitar (algunos) problemas con las barras invertidas en los nombres de sus archivos, use read -r line. Bueno, siempre use readcon -r. Además, puede evitar abrir job.shpara cada archivo. Simplemente coloque la redirección al final del comando:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

Segunda advertencia: este script no transfiere las marcas de tiempo de los directorios. (Bueno, el OP no lo pidió).
hagello

0

La mejor manera de copiar solo la marca de tiempo en Windows:

Para copiar la última marca de tiempo creada / modificada / accedida de un archivo a otra, puede usar:

toque / c / m / a / r SourceFile DestFile

(Esta versión de Touch es parte de Win32 Console ToolBox http://www.stevemiller.net/apps/ )

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA


-1

El manual de rsync: man rsynclistas de una -ty -Nconmutador, que podría valer la pena toquetear.


No pude ver -N. ¿Por qué me recomiendan estos de todos modos?
Tom Hale
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.