2009-08-13 24 views
6

considerar dos directorios:Sincronizar sin escanear archivos individuales?

 
/home/user/music/flac 
/media/MUSIC/flac 

Me gustaría que el segundo directorio (destino; una unidad USB) que contiene los mismos archivos y estructura que el primer directorio (maestro). Hay más de 3600 archivos (59G en total). Todos los archivos se escanean usando unison, que es dolorosamente lento. Prefiero que se compare según el nombre de archivo, el tamaño y la hora de modificación.

creo rsync podría ser mejor, pero los ejemplos de las páginas del manual son bastante críptica, y las búsquedas de Google no reveló ninguna ejemplos sencillos, interesantes. Preferiría no borrar accidentalmente archivos en el maestro. ;-)

La lista maestra cambiará con el tiempo: directorios reorganizados, nuevos archivos agregados y archivos existentes actualizados (por ejemplo, reetiquetado). Por lo general, los cambios son menores; tomar horas para completar una sincronización me parece poco óptimo.

¿Cuál es el comando exacto para sincronizar el directorio de destino con el maestro?

El comando debe copiar nuevos archivos, reorganizar los archivos movidos (o eliminar y luego copiar) y copiar los archivos modificados (en función de la fecha). Los archivos de destino deben tener su marca de tiempo establecida en la marca de tiempo del maestro.

Respuesta

6

Puede utilizar rsync esta manera:

rsync --delete -r -u /home/user/music/flac/* /media/MUSIC/flac 

Se eliminará los archivos en/media/MUSIC/FLAC (nunca en el Master), y la actualización basada en la fecha del archivo.

Hay más opciones, pero creo que esta forma es suficiente para usted. :-)

(! Acabo de hacer pruebas sencillas Por favor, prueba mejor!)

+1

'rsync' está diseñado para acelerar este tipo de sincronizaciones a través de una red, por lo que no tiene que enviar todos los 59G. No lo acelera en una máquina local, porque tanto el emisor como el receptor todavía tienen que leer todo en sus respectivos árboles. – caf

0

Puede utilizar el viejo y simple cp para copiar archivos de nueva & cambiar (siempre y cuando sus sistemas de archivos tienen marcas de tiempo de trabajo):

cp -dpRuv /home/user/music/flac /media/MUSIC/ 

Para eliminar archivos del destino que no existen en el origen, deberá usar find. Crear un script /home/user/bin/remover.sh así:

#!/bin/bash 

CANONNAME="$PWD/$(basename $1)" 
RELPATH=$(echo "$CANONNAME" | sed -e "[email protected]/media/MUSIC/flac/@@") 
SOURCENAME="/home/user/music/flac/$RELPATH" 

if [ ! -f "$SOURCENAME" ]; then 
     echo "Removing $CANONNAME" 
     rm "$CANONNAME" 
fi 

hacerlo ejecutable, a continuación, ejecutarlo desde find:

find /media/MUSIC/flac -type f -execdir /home/user/bin/remover.sh "{}" \; 

La única cosa que este no hará es eliminar directorios desde el destino que se han eliminado en la fuente: si quieres eso también tendrás que hacer un tercer pase, con una combinación de hallazgo/script similar.

+0

Esto no funciona para mí en bash: veo p (conservar los atributos de archivo), R (recursivo) yv (detallado) en las páginas man de bash para cp, pero no para d y u. – sage

Cuestiones relacionadas