Qual é a melhor maneira de sincronizar arquivos para uma partição VFAT?

7

Os nomes de arquivos POSIX podem conter todos os caracteres, exceto / , mas alguns sistemas de arquivos reservam caracteres como ?<>\:*|" . Usando pax , posso copiar arquivos enquanto substituo esses caracteres reservados:

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

Mas pax não possui uma opção --delete , como rsync e rsync não podem substituir caracteres. Estou procurando uma maneira simples de fazer backup da minha coleção de músicas em um disco rígido externo regularmente.

    
por Frank 11.01.2014 / 17:25

2 respostas

5

Você pode fazer uma visualização do sistema de arquivos FAT com a semântica POSIX, incluindo nomes de arquivos de suporte com qualquer caractere diferente de / ou um byte nulo. POSIXovl é um relativamente recente FUSE sistema de arquivos para isso.

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

Caracteres em nomes de arquivos que o VFAT não aceita são codificados como %(XX) , em que XX são dígitos hexadecimais. A partir do POSIXovl 1.2.20120215, lembre-se de que um nome de arquivo como %(3A) é codificado como ele mesmo e será decodificado como : , portanto, há risco de colisão se você tiver nomes de arquivos contendo substrings no formato %(XX) .

Cuidado com o fato de o POSIXovl não lidar com nomes de arquivos muito longos. Se o nome codificado não couber em 255 caracteres, o arquivo não pode ser armazenado.

O POSIXovl armazena permissões de unix e propriedade em arquivos chamados .pxovl.FILENAME .

    
por 12.01.2014 / 02:23
2

Eu estava curioso sobre isso, então eu fiz um pouco de escavação.

Existem algumas correções para fazer isso que nunca foram feitas em rsync, se você deseja compilar a partir da fonte. Embora ambos sejam antigos, talvez ainda não funcionem. Este adiciona especificamente uma --fat-filenames opção e esta para um --tr option .

Essas perguntas também abordam algo semelhante - Rsyncing arquivos com especial caracteres para USB FAT32 e link . A melhor aposta é provavelmente o rdiff-backup que faz a substituição, mas não vejo nenhuma opção para ter algum controle sobre ele. Existem outras boas ideias também.

Uma ideia aproximada de um script que excluiria e recriaria os arquivos toda vez, se não houvesse muitos, seria algo como:

[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 seria mais rápido que find se o banco de dados estiver razoavelmente atualizado.

Finalmente, você pode fazer isso para que os arquivos não causem mais problemas (pelo menos os existentes):

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

Eu recomendaria tentar isso com rename -n primeiro, caso algo dê errado.

    
por 11.01.2014 / 23:14