Fazendo rsyncing arquivos com caracteres especiais para USB FAT32

8

Eu quero copiar um grande número de arquivos para uma unidade USB formatada como FAT32 (e não pode ser formatada mais nada, infelizmente).

Muitos desses arquivos têm nomes com caracteres como : e ? que o FAT32 não permite. Tentando usar cp ou rsync , esses arquivos não são copiados e um erro é relatado declarando isso.

Eu não quero renomear os arquivos na fonte, mas eu também não ligo para o que os arquivos são renomeados na unidade USB de destino.

Esclarecimento sobre a finalidade (aplica-se também aos outros comentários): Isso é para um tocador de mp3 em um carro e o software só permite FAT32. Então não é para fins de backup. E os motivos pelos quais os nomes de arquivos têm caracteres estranhos são porque são, por exemplo, títulos de mp3s ou nomes de artistas.

Eu tentei algumas coisas:

  1. --iconv do rsync. Isso não parece funcionar, mas talvez eu não tenha usado corretamente.
  2. rdiff-backup , que eu li, faz essa conversão por padrão. No entanto, os arquivos de origem são links simbólicos que eu quero seguir (ou seja, a opção -L do rsync) e, nas manpages, não parece que rdiff-backup tenha essa opção.

Alguma outra sugestão?

    
por atorgovitsky 01.04.2013 / 18:43

2 respostas

4

O rsync com --iconv seria uma opção, mas primeiro você precisa definir uma codificação em que ? , : e outros sejam codificados com caracteres permitidos nos sistemas de arquivos FAT.

Para o seu caso de uso, você não está usando todo o poder do rsync para isso. Esta tarefa pode ser feita em algumas linhas de script de shell.

Este é um script básico que copia ~/Music para /media/usb99 , ignorando arquivos mais antigos no destino e converte : e ? em _ . Ele não detecta conflitos (suponho que você não tenha os dois foo:bar.mp3 e foo?bar.mp3 ).

#!/bin/bash
set -e
shopt -s dotglob globstar
cd ~/Music
for source in **/*; do
  target=/media/usb99/${source#"$HOME"/}
  target=${target//[:?]/_}
  if [[ -d $source ]]; then
    mkdir -p -- "$target"
  elif [[ $target -ot $source ]]; then
    cp -p -- "$source" "$target"
  fi
done

Este script funciona em zsh com pequenas modificações: substitua shopt -s dotglob globstar por setopt dot_glob e [[ $target -ot $source ]] por [[ ! -e $target || $target -ot $source ]] .

    
por 02.04.2013 / 02:08
2

Se for para fins de backup, apenas armazene um tarball. Sem problemas de nome de arquivo dessa maneira.

    
por 01.04.2013 / 19:25