Comment puis-je conserver les attributs de fichier Windows lors de la copie de fichiers sous Linux?

8

J'utilise un script Bash personnalisé exécuté sur une machine Linux pour dupliquer en masse des lecteurs USB au format FAT32.

J'ai besoin de préserver les attributs de fichier Windows tels que "caché".

J'utilise rsync(ou ddavec findet mkdirdans une version plus récente pour forcer la synchronisation des E / S pour une meilleure stabilité et une utilisation optimale de la bande passante).

J'ai aveuglément essayé -Xet -Achange pour rsync, qui sont censés conserver certains attributs de fichier, mais ils ne semblent pas fonctionner pour les attributs de fichier Windows.

Existe-t-il un moyen de lire et d'écrire des attributs de fichier Windows dans un environnement Linux?

Je pourrais les appliquer après la copie s'il n'y a pas de moyen plus simple.

Je ne veux pas ddun système de fichiers source complet, car cela ne sera pas optimisé, surtout lorsque vous devez écrire des centaines de lecteurs. Parfois, les disques ont une capacité de 16 Go, et seulement quelques Go de fichiers sur eux - et un idiot ddcopierait tous les 16 Go, prenant trop de temps pour que cela fonctionne en production.

J'ai cherché sur le Web, mais il semble que les attributs étendus Linux n'aient rien à voir avec les attributs de fichiers Windows, et je n'ai trouvé aucun moyen de lire et d'écrire ces informations (ou simplement de les copier avec les fichiers).

unfa
la source
"Caché" est-il le seul que vous souhaitez conserver ou y en a-t-il un autre?
M. Becerra
2
Intéressant. Le pilote Linux VFAT exporte-t-il même ces attributs d'une manière qui pourrait être écrite?
ilkkachu
@ M.Becerra - actuellement, je n'ai besoin que de l'attribut "caché", et je n'en aurai probablement pas besoin d'autre à l'avenir.
unfa
@StephenKitt - J'ai besoin de pouvoir lire cela depuis le système de fichiers source et transférer ces informations vers mes nouveaux systèmes de fichiers dupliqués. Je suppose qu'une méthode très grossière pour contourner ce problème serait de remplir à zéro le système de fichiers source (pour nettoyer l'espace vide), de créer une image dd compressée et d'écrire cela sur les nouveaux disques en ignorant les parties éparses pour éviter d'écrire des parties vides de la image. C'est un peu bruteforce et je suppose qu'il n'aurait pas de performances comparables à rsyncou manuel find/ mkdir/ ddopération que j'utilise en ce moment.
unfa
1
@ilkkachu oui, c'est le cas, il y a deux ioctls qui peuvent être utilisés pour récupérer et définir des attributs FAT. Voir fatattrpour une implémentation d'un outil utilisant ces derniers.
Stephen Kitt

Réponses:

1

Je peux penser à deux façons de gérer cela.

La première consiste à utiliser Mtools pour copier les fichiers. Pour que cela fonctionne, vous devez définir des «lecteurs» (disons A: pour le lecteur source, B: pour la cible), puis vous devriez pouvoir tout copier, en préservant les attributs et les horodatages, en utilisant

mcopy -s -p -m a: b:

(non testé).

La seconde consiste à post-traiter les attributs à l'aide de fatattr(qui est disponible dans la plupart des distributions). Il gère les systèmes de fichiers montés, vous devez donc copier vos systèmes de fichiers de la même manière que vous le faites actuellement, puis les utiliser fatattrpour répertorier tous les attributs FAT de tous les fichiers source, et les analyser pour demander fatattrde définir les attributs de manière appropriée sur les fichiers cibles .

Stephen Kitt
la source
J'ai eu des problèmes avec mcopy, il s'est écrasé en essayant de copier le dossier "System Volume Information" provoquant une erreur GCC "smashing stack stack found". Je vais donc essayer d'utiliser fatattr.
unfa
Vous avez des «Informations sur le volume du système» sur un système de fichiers FAT32? Je pensais que c'était une chose NTFS seulement.
Stephen Kitt
Il faudrait que je revienne.
unfa