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 cp
ou 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:
--iconv
opção do rsync . Isso não pareceu funcionar, mas talvez eu não o tenha usado corretamente.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-L
opção rsync ) e, nas páginas do manual, parece que nãordiff-backup
há essa opção.
Alguma outra sugestão?
rsync
a--iconv
opção não é feita para o que você está tentando usá-lo.--iconv
faz conversões de conjuntos de caracteres, por exemplo, latin1 <-> utf8. Não é o que você está procurando.Respostas:
Rsync com
--iconv
seria 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
~/Music
para/media/usb99
, pulando arquivos mais antigos no destino e converte:
e?
para_
. Ele não detecta conflitos (presumo que você não tenha os doisfoo:bar.mp3
efoo?bar.mp3
).Este script funciona no zsh com pequenas modificações: substitua
shopt -s dotglob globstar
porsetopt dot_glob
e[[ $target -ot $source ]]
por[[ ! -e $target || $target -ot $source ]]
.fonte
Se for para fins de backup, apenas esconda um tarball. Nenhum problema de nome de arquivo dessa maneira.
fonte