2009-08-13 12 views
6

Rozważmy dwa katalogi:Synchronizacja bez skanowania pojedynczych plików?

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

Chciałbym drugi katalog (docelowy, dysk USB) zawierają te same pliki i strukturę jak w pierwszym katalogu (master). Jest 3600 plików (łącznie 59G). Każdy plik jest skanowany przy użyciu unison, który jest bardzo wolny. Wolałbym to porównać na podstawie nazwy pliku, rozmiaru i czasu modyfikacji.

Myślę, że rsync może być lepiej, ale przykłady ze stron man są dość zagadkowe, a wyszukiwania Google nie ujawniły żadnych prostych, wnikliwych przykładów. Wolałbym raczej nie usuwać przypadkowo plików w systemie głównym. ;-)

Lista główna zmieni się z upływem czasu: reorganizacja katalogów, dodanie nowych plików i zaktualizowanie istniejących plików (np. Ponowne tagowanie). Zwykle zmiany są niewielkie; poświęcenie godzin na synchronizację wydaje mi się nieoptymalne.

Jakie jest dokładne polecenie synchronizacji katalogu docelowego z wzorcem?

Polecenie powinno skopiować nowe pliki, uporządkować przeniesione pliki (lub usunąć, a następnie skopiować) i skopiować zmienione pliki (na podstawie daty). Pliki docelowe powinny mieć swój znacznik czasu ustawiony na znacznik czasu wzorca.

Odpowiedz

6

Można użyć rsync ten sposób:

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

usunie pliki w/media/music/flac (nigdy na master) i aktualizacji w oparciu o dacie plików.

Jest więcej opcji, ale myślę, że ten sposób jest dla ciebie wystarczający. :-)

(! Właśnie tak prostych testów Proszę przetestować lepiej!)

+1

'rsync' ma na celu przyspieszenie tego rodzaju synchronizacji w sieci, więc nie trzeba wysyłać wszystkich 59G. Nie przyspiesza to na lokalnym komputerze, ponieważ zarówno nadawca, jak i odbiorca wciąż muszą czytać wszystko w swoich drzewach. – caf

0

Można używać zwykłego starego cp skopiować nowy & zmienione pliki (tak długo, jak systemy plików mają znaczniki czasu pracy):

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

Aby usunąć pliki z miejsca docelowego, które nie istnieją u źródła, należy użyć funkcji Znajdź. Utwórz skrypt /home/user/bin/remover.sh tak:

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

Zrób to plik wykonywalny, a następnie uruchomić go z find:

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

Jedyną rzeczą, nie będzie to zrobić, to usunąć katalogi od miejsca przeznaczenia, które zostały usunięte w źródło - jeśli tego chcesz, będziesz musiał wykonać trzecie przejście, z podobną kombinacją find/script.

+0

To nie działa dla mnie w bash - widzę p (zachowaj atrybuty pliku), R (rekursywny) i v (verbose) na stronach basha dla cp, ale nie d i u. – sage