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
rsync
copy
synchronization
timestamp
artella
fuente
fuente
Respuestas:
Usando
-t
(preservar marcas de tiempo) y--size-only
solo comparará archivos en tamaño. Si el tamaño coincide, rsync no copiará el archivo, pero como-t
se 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:
fuente
--existing
para evitar copias accidentales de nuevos archivos.--archive
(o-a
) incluye-r
,-t
y más :)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.
fuente
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:
Y obtenga los comandos de actualización de tiempo apropiados:
¡No es un guión completo, pero es un buen lugar para comenzar! :)
fuente
Utilice el directorio de origen (p
/path/to/source
. Ej. ) Como referencia para el comando táctil. Solocd
a su directorio de destino y hacerNo 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
)fuente
touch -ar
pero eso aún no cambia el ctime. Supongo que rara vez se desea.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.
fuente
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.
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 eltouch
comando posterior lo utiliza.find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
Modifica tus archivos tanto como quieras
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
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.fuente
read -r line
. Bueno, siempre useread
con-r
. Además, puede evitar abrirjob.sh
para 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
La mejor manera de copiar solo la marca de tiempo en Windows:
(Esta versión de Touch es parte de Win32 Console ToolBox http://www.stevemiller.net/apps/ )
fuente
El manual de rsync:
man rsync
listas de una-t
y-N
conmutador, que podría valer la pena toquetear.fuente
-N
. ¿Por qué me recomiendan estos de todos modos?