Po przeczytaniu odpowiedzi na to bardzo interesujące pytanie i przeprowadzeniu eksperymentów z kartą SD dla Androida (exfat) i samochodowym systemem rozrywki (vfat), wymyśliłem ten mały skrypt 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
Bierze miejsce docelowe (punkt montowania) jako argument i służy finddo lokalizowania wszystkich plików w moim repozytorium muzycznym.
Dla każdej ścieżki pliku oblicza ścieżkę docelową i nazwę pliku, poprzedzając miejsce docelowe i zastępując każdy znak obrażający znakiem podkreślenia _. Używam białą listę znaków (litery, cyfry, -, /, ., . (, )I _), aby usunąć niechciane znaki interpunkcyjne.
W zależności od ustawień regionalnych pozostawi to litery akcentowane w ścieżce i nazwie pliku, co wydaje się odpowiednie dla nowoczesnych systemów plików FAT, jak się wydaje.
Dla każdej ścieżki i nazwy pliku docelowego katalogi są tworzone w razie potrzeby za pomocą mkdir -p, a następnie plik jest kopiowany, chyba że już istniał.
Zanotuj "znaki cudzysłowu w różnych miejscach, są one wymagane, aby ścieżki i nazwy ze spacjami nie rozpadały się.