Каков наилучший способ синхронизации файлов с разделом VFAT?

Имена файлов POSIX могут содержать все символы кроме / , но некоторые файловые системы резервируют символы, такие как ?<>\\:*|" . Используя pax , я могу копировать файлы при замене этих зарезервированных символов:

 $ pax -rw -s '/[?<>\\:*|\"]/_/gp' /source /target 

Но у pax отсутствует опция --delete как rsync и rsync не может заменить символы. Я ищу простой способ резервного копирования моей музыкальной коллекции на внешний жесткий диск на регулярной основе.

Вы можете просмотреть файловую систему FAT с семантикой POSIX, включая поддержку имен файлов с любым символом, отличным от / или нулевым байтом. POSIXovl – относительно новая файловая система FUSE для этого.

 mkdir backup-fat mount.posixovl -S /media/sdb1 backup-fat rsync -au /source backup-fat/target 

Символы в именах файлов, которые VFAT не принимает, кодируются как %(XX) где XX – шестнадцатеричные цифры. Начиная с POSIXovl 1.2.20120215, будьте осторожны, что имя файла, такое как %(3A) , закодировано как само, и будет декодировано как : поэтому существует риск столкновения, если у вас есть имена файлов, содержащие подстроки формы %(XX) ,

Помните, что POSIXovl не справляется с длинными именами файлов. Если кодированное имя не соответствует 255 символам, файл не может быть сохранен.

POSIXovl хранит разрешения unix и права собственности в файлах с именем .pxovl.FILENAME .

Мне было любопытно, поэтому я немного поработал.

Есть несколько патчей, чтобы сделать это, что никогда не попадало в rsync, если вы хотите компилировать исходный код. Хотя оба они старые, поэтому они, возможно, еще не работают. В этом добавляется --fat-filenames а для опции --tr .

Эти вопросы также охватывают нечто подобное: Rsyncing файлы со специальными символами на USB FAT32 и https://askubuntu.com/questions/11634/how-can-i-substitute-colons-when-i-rsync-on-a-usb- ключ . Лучший вариант – это, вероятно, rdiff-backup, который выполняет подстановку, но я не вижу никаких параметров, чтобы иметь какой-либо контроль над ним. Однако есть и другие хорошие идеи.

Грубая идея для скрипта, который будет удалять и воссоздавать файлы каждый раз, если их не так много, будет примерно такой:

 [sudo] updatedb # doing this as root will update the system database locate -r '^/full/path/to/source/.*[?<>\\:*|\"]' | sed 's\^/full/path/to/source/\\' >bad_names rsync --delete --exclude-from=bad_names -av source/ target cd source <bad_names pax -rw -s '/[?<>\\:*|\"]/_/gp' target 

locate будет быстрее, чем find если база данных достаточно обновлена.

Наконец, вы можете просто сделать это, чтобы файлы не вызывали больше проблем (по крайней мере, существующих в настоящее время):

 find source/ -regex '[?<>\\:*|\"]' -exec rename 's/'[?<>\\:*|\"]'/_/g' {} + 

Я бы рекомендовал попробовать это с rename -n сначала, если на что-то пойдет не так.