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 ]]
.