GNU/Linux >> Belajar Linux >  >> Linux

Adakah Cara Untuk Menyinkronkan Struktur Direktori Saat File Sudah Di Kedua Sisi?

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.

Terkait:bagaimana cara glob setiap file tersembunyi kecuali direktori saat ini dan induk?
Linux
  1. [Linux]:Cara menyalin file/direktori tanpa menimpa file yang sudah disalin!

  2. Apa Cara Terbaik Untuk Menghitung Jumlah File Dalam Direktori?

  3. Cara Cepat Untuk Menyertakan Jalur Direktori Saat Memanggil Mv??

  1. Ke Mana File Pergi Saat Perintah Rm Dikeluarkan?

  2. Apakah ada cara untuk membuat mv membuat direktori untuk dipindahkan jika tidak ada?

  3. Linux:Bandingkan Struktur Direktori Tanpa Membandingkan File

  1. Apa perbedaan antara file .txt Linux dan Windows (pengodean Unicode)

  2. Di mana direktori sementara di Linux?

  3. Ketika Anda menginstal apt-get di mana file .deb disimpan?