ファイルがすでに両側にあるときにディレクトリ構造を同期させる方法はありますか?

ファイルがすでに両側にあるときにディレクトリ構造を同期させる方法はありますか?

ファイルは同じですが、ディレクトリ構造が完全に異なる2つのドライブがあります。

ソース側の構造と一致するように、ターゲット側のすべてのファイルを「移動」する方法はありますか?たぶんスクリプトがありますか?

たとえば、ドライブAには次のものがあります。

/foo/bar/123.txt
/foo/bar/234.txt
/foo/bar/dir/567.txt

Bドライブには次のものがあります。

/some/other/path/123.txt
/bar/doo2/wow/234.txt
/bar/doo/567.txt

問題のファイルは大容量(800GB)なので、再コピーしたくなく、必要なディレクトリを作成してファイルを移動して構造を同期したいと思います。

私はターゲットのすべてのソースファイルを見つけて、それを一致するディレクトリに移動し、必要に応じて生成する再帰スクリプトを考えています。しかし-これは私の能力の外である!

別のエレガントなソリューションがここに提供されます。 https://superuser.com/questions/237387/any-way-to-sync-directory-struct-when-the-files-are-already-on-both-sides/238086

ベストアンサー1

Gillesと一緒に行き、提案通りにUnisonを教えてください。ハサン剤。 UnisonはDropBoxより20年先のDropBoxです。多くの人(自分自身を含む)が毎日使用する堅牢なコード - 学ぶ価値が十分にあります。まだjoin入手できるすべてのプロモーションが必要です:)


これは答えの半分にすぎませんが、再び仕事に行かなければなりません:)

基本的に、私はまさにこれを行うよく知られていないjoinユーティリティを見せたいと思います。つまり、特定のフィールドで2つのテーブルを結合することです。

まず、スペースを含むファイル名を含むテストケースを設定します。

for d in a b 'c c'; do mkdir -p "old/$d"; echo $RANDOM > "old/${d}/${d}.txt"; done
cp -r old new

(一部のディレクトリおよび/またはファイル名の編集new

これで、各ディレクトリ(ハッシュ - >ファイル名)のマップを構築し、それを使用してjoin同じハッシュとファイルを一致させようとしています。地図を作成するには、次のように入力しますmakemap.sh

find "$1" -type f -exec md5 -r "{}" \; \
  | sed "s/\([a-z0-9]*\) ${1}\/\(.*\)/\1 \"\2\"/" \

makemap.sh"hash "filename""形式の行を含むファイルを生成するため、最初の列のみを結合します。

join <(./makemap.sh 'old') <(./makemap.sh 'new') >moves.txt

これにより、moves.txt次のような結果が生成されます。

49787681dd7fcc685372784915855431 "a/a.txt" "bar/a.txt"
bfdaa3e91029d31610739d552ede0c26 "c c/c c.txt" "c c/c c.txt"

次のステップは実際に作業を行うことですが、私の試みが参照に閉じ込められて役に立ちmv -iますmkdir -p

おすすめ記事