2009-08-13 3 views
6

個々のファイルをスキャンすることなく同期しますか?

2つのディレクトリを考えてみましょう。

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

最初のディレクトリ(マスタ)と同じファイルと構造を格納する2番目のディレクトリ(宛先:USBドライブ)が必要です。 3600+ファイル(合計59G)があります。すべてのファイルは、unisonを使用してスキャンされます。ファイル名、サイズ、および変更時刻に基づいて比較したいと思います。

私はrsyncが良いかもしれないと思うが、マニュアルページの例はやや秘密で、Google検索では簡単で分かりやすい例は明らかにされていない。マスターのファイルを誤って消去しないでください。 ;-)

ディレクトリが再編成され、新しいファイルが追加され、既存のファイルが更新されます(例えば、再タグ付け)。通常、変更は軽微です。同期を完了するのに数時間を要することは、私にとっては最適以下と感じます。

宛先ディレクトリとマスタを同期させる正確なコマンドは何ですか?

コマンドは、新しいファイルをコピーし、移動したファイルを再編成したり、コピーしたり、変更したファイルを(日付に基づいて)コピーする必要があります。宛先ファイルのタイムスタンプはマスタのタイムスタンプに設定する必要があります。

答えて

6

あなたはrsyncのをこの方法を使用することができます。

さらにオプションがありますが、この方法で十分です。 :-)

(私は簡単なテストをした、より良いテストをしてください!)

+1

'rsync'は、ネットワーク上でこれらの種類の同期を高速化するように設計されているため、59Gをすべて送信する必要はありません。送信者と受信者の両方がそれぞれのツリー内のすべてを読み取る必要があるため、ローカルマシンでは高速化されません。 – caf

0

あなたは(限り、あなたのファイルシステムが機能してタイムスタンプを持っているように)新しい&変更されたファイルをコピーするために、昔ながらのcpを使用することができます。

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

ソースに存在しないファイルを削除するには、findを使用する必要があります。そのようなスクリプト/home/user/bin/remover.shを作成します。

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

それが実行可能にし、findからそれを実行します。

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

これはないだろう唯一のことはして削除された先からディレクトリを削除でソース - あなたも同じような検索/スクリプトの組み合わせで、3回目のパスをしなければならない場合もあります。

+0

これはbashで私にとってはうまくいかず、cpのbashのmanページにはp(ファイル属性を保持)、R(再帰的)、v(冗長)が表示されますが、dとuは表示されません。 – sage