Bagaimana saya bisa mempertahankan atribut file Windows ketika menyalin file di Linux?

8

Saya menggunakan skrip Bash khusus yang berjalan pada mesin Linux untuk menduplikat drive USB berformat FAT32 secara massal.

Saya perlu mempertahankan atribut file Windows seperti "tersembunyi".

Saya menggunakan rsync(atau dddengan finddan mkdirdalam versi yang lebih baru untuk memaksa sinkronisasi I / O untuk stabilitas yang lebih baik dan penggunaan bandwidth yang optimal).

Saya mencoba -Xdan -Aberalih secara membabi buta rsync, yang dikatakan untuk mempertahankan beberapa atribut file, tetapi mereka tampaknya tidak berfungsi untuk atribut file Windows.

Apakah ada cara untuk membaca dan menulis atribut file Windows di lingkungan Linux?

Saya bisa menerapkannya setelah menyalin jika tidak ada cara yang lebih mudah.

Saya tidak ingin ddseluruh sistem file sumber, karena itu akan sangat tidak dioptimalkan, terutama ketika Anda perlu menulis ratusan drive. Kadang-kadang drive berkapasitas 16GB, dan hanya beberapa GB file pada mereka - dan bodoh ddakan menyalin semua 16GB, membutuhkan waktu lama untuk bekerja dalam produksi.

Saya telah mencari di web, tetapi sepertinya atribut yang diperluas Linux tidak ada hubungannya dengan atribut file Windows, dan saya belum menemukan cara untuk membaca dan menulis informasi ini (atau hanya menyalinnya dengan file).

unfa
sumber
Apakah "tersembunyi" satu-satunya yang ingin Anda pertahankan atau ada yang lain?
M. Becerra
2
Menarik. Apakah driver Linux VFAT bahkan mengekspor atribut tersebut dengan cara apa pun yang dapat ditulis?
ilkkachu
@ M.Becerra - saat ini saya hanya perlu atribut "tersembunyi", dan saya mungkin tidak akan memerlukan yang lain di masa depan.
unfa
@StephenKitt - Saya harus bisa membacanya dari sistem file sumber dan mentransfer informasi itu ke sistem file baru saya. Saya kira metode yang sangat kasar untuk mengatasi masalah ini adalah dengan mengisi nol sistem file sumber (untuk membersihkan ruang kosong), membuat gambar dd terkompresi dan menulis bahwa ke drive baru melewatkan bagian jarang untuk menghindari penulisan bagian kosong dari gambar. Itu sedikit bruteforce dan saya kira itu tidak akan memiliki kinerja yang sebanding rsyncatau manual find/ mkdir/ ddoperasi yang saya gunakan saat ini.
unfa
1
@ilkkachu ya, benar, ada dua ioctl yang dapat digunakan untuk mengambil dan mengatur atribut FAT. Lihat fatattruntuk satu implementasi alat menggunakan ini.
Stephen Kitt

Jawaban:

1

Saya dapat memikirkan beberapa cara untuk menangani ini.

Yang pertama adalah menggunakan Mtools untuk menyalin file. Agar ini berfungsi, Anda harus mendefinisikan "drive" (katakanlah A: untuk drive sumber, B: untuk target), maka Anda harus dapat menyalin semuanya, menjaga atribut dan cap waktu, menggunakan

mcopy -s -p -m a: b:

(belum dicoba).

Yang kedua adalah pasca proses atribut menggunakan fatattr(yang tersedia di sebagian besar distribusi). Ini menangani sistem file yang di-mount, jadi Anda akan menyalin sistem file Anda dengan cara yang sama seperti yang Anda lakukan saat ini, kemudian gunakan fatattruntuk mendaftar semua atribut FAT dari semua file sumber, dan menguraikannya untuk menginstruksikan fatattruntuk mengatur atribut dengan tepat pada file target. .

Stephen Kitt
sumber
Saya mengalami masalah dengan mcopyitu, macet saat mencoba menyalin folder "Informasi Volume Sistem" yang menaikkan kesalahan "stack smashing terdeteksi" GCC. Jadi saya akan coba gunakan fatattr.
unfa
Anda mendapat "Informasi Volume Sistem" pada sistem file FAT32? Saya pikir itu hanya masalah NTFS.
Stephen Kitt
Saya harus memeriksanya kembali.
unfa