Depois de ler as respostas para esta pergunta muito interessante e fazer algumas experiências com o cartão SD para Android (exfat) e um sistema de entretenimento de carro (vfat), eu vim até este pequeno script bash.
#! /bin/bash
DST=$1
# copy music to FAT media
find music/ Music/ -type f | while read f ; do
d=$DST/$( echo $f | sed 's/[^-A-Za-z0-9/._ ()]/_/g' )
echo :$d:
mkdir -p "$(dirname "$d")"
cp -n "$f" "$d"
done
Ele toma o destino (ponto de montagem) como argumento e usa find
para localizar todos os arquivos no meu repositório de músicas.
Para cada caminho de arquivo, ele calcula um caminho de destino e um nome de arquivo, prefixando o destino e substituindo qualquer caractere incorreto por um sublinhado _
. Eu uso uma lista branca de caracteres (letras, dígitos, -
, /
, .
,
. (
, )
e _
) para remover qualquer pontuação indesejada.
Dependendo da localidade, isso deixará letras acentuadas no caminho e no nome do arquivo, o que é OK para os modernos sistemas de arquivos FAT, como parece.
Para cada caminho e nome do arquivo de destino, os diretórios são criados conforme necessário usando mkdir -p
, e o arquivo é copiado, a menos que já exista.
Observe que a citação "
chars em vários lugares exige que os caminhos e nomes com espaços neles se quebrem.