ファイルは同じですが、ディレクトリ構造が完全に異なる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
。