Saya memiliki dua drive dengan file yang sama, tetapi struktur direktorinya sama sekali berbeda.
Apakah ada cara untuk 'memindahkan' semua file di sisi tujuan agar sesuai dengan struktur sisi sumber? Dengan naskah mungkin?
Misalnya, drive A memiliki:
/foo/bar/123.txt
/foo/bar/234.txt
/foo/bar/dir/567.txt
Sedangkan drive B memiliki:
/some/other/path/123.txt
/bar/doo2/wow/234.txt
/bar/doo/567.txt
File yang dimaksud sangat besar (800GB), jadi saya tidak ingin menyalinnya kembali; Saya hanya ingin menyinkronkan struktur dengan membuat direktori yang diperlukan dan memindahkan file.
Saya sedang memikirkan skrip rekursif yang akan menemukan setiap file sumber di tujuan, lalu memindahkannya ke direktori yang cocok, membuatnya jika perlu. Tapi — itu di luar kemampuanku!
Solusi elegan lainnya diberikan di sini:
https://superuser.com/questions/237387/any-way-to-sync-directory-structure-when-the-files-are-already-on-both-sides /238086
Jawaban yang Diterima:
Saya akan pergi dengan Gilles dan mengarahkan Anda ke Unison seperti yang disarankan oleh hasen j. Serempak adalah DropBox 20 tahun sebelum DropBox. Kode solid yang digunakan banyak orang (termasuk saya sendiri) setiap hari — sangat berharga untuk dipelajari. Tetap saja, join
membutuhkan semua publisitas yang bisa didapat 🙂
Ini baru setengah jawaban, tapi aku harus kembali bekerja
Pada dasarnya, saya ingin mendemonstrasikan join
yang kurang diketahui utilitas yang melakukan hal itu:menggabungkan dua tabel pada beberapa bidang.
Pertama, siapkan kasus uji termasuk nama file dengan spasi:
for d in a b 'c c'; do mkdir -p "old/$d"; echo $RANDOM > "old/${d}/${d}.txt"; done
cp -r old new
(edit beberapa direktori dan/atau nama file di new
).
Sekarang, kita ingin membuat peta:hash -> nama file untuk setiap direktori dan kemudian gunakan join
untuk mencocokkan file dengan hash yang sama. Untuk membuat peta, masukkan kode berikut di makemap.sh
:
find "$1" -type f -exec md5 -r "{}" ;
| sed "s/([a-z0-9]*) ${1}/(.*)/1 "2"/"
makemap.sh
memuntahkan file dengan baris formulir, 'hash "nama file"', jadi kita gabung saja di kolom pertama:
join <(./makemap.sh 'old') <(./makemap.sh 'new') >moves.txt
Ini menghasilkan moves.txt
yang terlihat seperti ini:
49787681dd7fcc685372784915855431 "a/a.txt" "bar/a.txt"
bfdaa3e91029d31610739d552ede0c26 "c c/c c.txt" "c c/c c.txt"
Langkah selanjutnya adalah benar-benar melakukan gerakan, tetapi upaya saya terhenti saat mengutip… mv -i
dan mkdir -p
akan berguna.