Прочитав ответы на этот очень интересный вопрос и поэкспериментировав с SD-картой для Android (exfat) и автомобильной развлекательной системой (vfat), я придумал этот маленький скрипт 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
Он принимает пункт назначения (точку монтирования) в качестве аргумента и использует find
чтобы найти все файлы в моем музыкальном хранилище.
Для каждого пути к файлу он вычисляет путь назначения и имя файла, добавляя место назначения и заменяя любой оскорбительный символ подчеркиванием _
. Я использую белый список символов (буквы, цифры, -
, /
, .
,
, (
, )
и _
), чтобы удалить все ненужные знаки препинания.
В зависимости от локали это оставит акцентированные буквы в пути и имени файла, что, как кажется, нормально для современных файловых систем FAT.
Для каждого пути и имени файла назначения каталоги создаются по мере необходимости с помощью mkdir -p
, затем файл копируется, если он еще не существовал.
Обратите внимание на цитату "
символы в разных местах, они необходимы для того, чтобы пути и имена с пробелами в них не разрывались.