2009-08-13 10 views
6

Betrachten wir zwei Verzeichnisse:Synchronisieren ohne einzelne Dateien zu scannen?

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

ich das zweite Verzeichnis möchten (Ziel, ein USB-Laufwerk) enthalten die gleichen Dateien und Struktur wie das erste Verzeichnis (Master). Es gibt 3600 + Dateien (59G insgesamt). Jede Datei wird mit unison gescannt, was sehr langsam ist. Ich würde es lieber anhand von Dateiname, Größe und Modifikationszeit vergleichen.

denke ich rsync könnte besser sein, aber die Beispiele aus dem Manpages sind eher kryptisch, und Google-Suchanfrage ergaben keine einfachen, interessante Beispiele. Ich möchte lieber nicht versehentlich Dateien im Master löschen. ;-)

Die Master-Liste wird sich im Laufe der Zeit ändern: Verzeichnisse werden neu organisiert, neue Dateien hinzugefügt und vorhandene Dateien aktualisiert (z. B. Re-Tagging). Normalerweise sind die Änderungen geringfügig; Stunden dauern, um eine Synchronisation abzuschließen, erscheint mir als suboptimal.

Was ist der genaue Befehl, um das Zielverzeichnis mit dem Master zu synchronisieren?

Der Befehl sollte neue Dateien kopieren, verschobene Dateien reorganisieren (oder löschen, dann kopieren) und geänderte Dateien kopieren (basierend auf dem Datum). Für die Zieldateien sollte der Zeitstempel auf den Zeitstempel des Masters gesetzt sein.

Antwort

6

können Sie rsync auf diese Weise verwenden:

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

Es werden die Dateien in/media/MUSIC/flac (nie auf Master) und zu aktualisieren, basierend auf Dateidatum löschen.

Es gibt mehr Optionen, aber ich denke, dass dieser Weg für Sie ausreichend ist. :-)

(! I einfache Tests nur tat Testen Sie besser!)

+1

'rsync' wurde entwickelt, um diese Art von Synchronisationen über ein Netzwerk zu beschleunigen, so dass Sie nicht alle 59G senden müssen. Es beschleunigt nicht auf einem lokalen Rechner, da sowohl Absender als auch Empfänger immer noch alles in ihren jeweiligen Bäumen lesen müssen. – caf

0

Sie plain old cp können kopieren neue & Dateien geändert (solange Ihre Dateisysteme arbeiten Zeitstempel haben):

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

Um Dateien vom Ziel zu löschen, die an der Quelle nicht vorhanden sind, müssen Sie find verwenden. Erstellen Sie ein Skript /home/user/bin/remover.sh wie so:

#!/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 

ausführbar machen, dann führen Sie es von find:

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

Das einzige, was dies nicht tun, ist entfernen Verzeichnisse aus dem Ziel, die entfernt wurden in die Quelle - wenn Sie das auch wollen, müssen Sie einen dritten Durchlauf machen, mit einer ähnlichen Kombination aus Fund und Skript.

+0

Dies funktioniert nicht für mich in bash - ich sehe p (beibehalten Dateiattribute), R (rekursiv) und v (verbose) in den bash man Seiten für cp, aber nicht d und u. – sage

Verwandte Themen