Rsyncing arquivos com caracteres especiais para USB FAT32

8

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

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

Não quero renomear os arquivos na fonte, mas também não me importo com o que os arquivos são renomeados na unidade USB de destino.

Esclarecimento sobre o objetivo (aplica-se também aos outros comentários): É para um mp3 player em um carro e o software permite apenas o FAT32. Portanto, não é para fins de backup. E a razão pela qual os nomes de arquivos têm caracteres estranhos é porque eles são, por exemplo, títulos de mp3s ou nomes de artistas.

Eu tentei algumas coisas:

  1. --iconvopção do rsync . Isso não pareceu funcionar, mas talvez eu não o tenha usado corretamente.
  2. rdiff-backup, que li faz essa conversão por padrão. No entanto, os arquivos de origem são links simbólicos que eu quero que sejam seguidos (por exemplo, a -Lopção rsync ) e, nas páginas do manual, parece que não rdiff-backuphá essa opção.

Alguma outra sugestão?

atorgovitsky
fonte
Primeiro de tudo, por que você não pode reformatar a unidade USB e por que possui nomes de arquivos com dois pontos e pontos de interrogação? Embora esses caracteres sejam permitidos pelo sistema de arquivos na unidade de origem, eles tendem a ser problemáticos para o trabalho e a portabilidade do shell. Além disso, rsynca --iconvopção não é feita para o que você está tentando usá-lo.
depquid
1
@ deppid é apenas um problema para o trabalho de shell se você escrever um código de buggy.
Jordanm #
@ Jordanm Eu estava pensando mais sobre o uso de shell interativo. Claro que isso pode ser feito, mas trabalhar com caracteres mais padrão é mais conveniente, IMHO.
depquid
1
Para sua informação, --iconvfaz conversões de conjuntos de caracteres, por exemplo, latin1 <-> utf8. Não é o que você está procurando.
Derobert
Pergunta semelhante no Ask Ubuntu: Como posso substituir dois pontos quando eu sincronizo uma chave USB?
Gilles 'SO- stop be evil'

Respostas:

4

Rsync com --iconvseria uma opção, mas você primeiro precisa definir uma codificação em que ?,: e outros estão codificados com caracteres que são permitidos em 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 realizada em algumas linhas de script de shell.

Aqui está um script bash que copia ~/Musicpara /media/usb99, pulando arquivos mais antigos no destino e converte :e ?para _. Ele não detecta conflitos (presumo que você não tenha os dois foo:bar.mp3e 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 no zsh com pequenas modificações: substitua shopt -s dotglob globstarpor setopt dot_globe [[ $target -ot $source ]]por [[ ! -e $target || $target -ot $source ]].

Gilles 'SO- parar de ser mau'
fonte
2

Se for para fins de backup, apenas esconda um tarball. Nenhum problema de nome de arquivo dessa maneira.

vonbrand
fonte
1
Esclarecimento sobre o objetivo (aplica-se também aos outros comentários): É para um mp3 player em um carro e o software permite apenas o FAT32. Portanto, não é para fins de backup. E a razão pela qual os nomes de arquivos têm caracteres estranhos é porque eles são, por exemplo, títulos de mp3s ou nomes de artistas.
Atorgovitsky
3
@atorgovitsky Você deve editar sua pergunta original para fornecer esses detalhes.
depquid