Rsyncing файлы со специальными символами на USB FAT32

Я хочу скопировать большое количество файлов на USB-накопитель, который отформатирован FAT32 (и, к сожалению, его нельзя отформатировать).

Многие из этих файлов имеют имена с такими символами, как : и ? что FAT32 не позволяет. Пытаясь использовать cp или rsync , эти файлы не копируются и сообщается об ошибке.

Я не хочу переименовывать файлы в исходном коде, но мне также все равно, что файлы переименованы на целевой USB-диск.

Разъяснение цели (применимо и к другим комментариям): это для mp3-плеера в автомобиле, и программное обеспечение разрешает только FAT32. Так что это не для целей резервного копирования. И причины, по которым имена файлов имеют странные символы, – это потому, что они, например, названия mp3-файлов или имена артистов.

Я пробовал пару вещей:

  1. --iconv rsync --iconv . Это, похоже, не работает, но, возможно, я не использовал его правильно.
  2. rdiff-backup , который я прочитал, делает это преобразование по умолчанию. Однако исходные файлы представляют собой символические ссылки, которые я хочу использовать (например, параметр -s rsync -L ), и из manpages не кажется, что это rdiff-backup имеет этот параметр.

Любые другие предложения?

2 Solutions collect form web for “Rsyncing файлы со специальными символами на USB FAT32”

Rsync с --iconv будет вариантом, но сначала вам нужно определить кодировку где ? , : и другие кодируются символами, разрешенными для файловых систем FAT.

Для вашего случая использования вы не используете для этого всю силу rsync. Эта задача может быть выполнена в нескольких строках сценария оболочки.

Вот сценарий bash, который копирует ~/Music to /media/usb99 , пропуская файлы, которые старше на цель, и преобразует : и ? to _ . Он не обнаруживает столкновения (я полагаю, у вас нет обоих foo:bar.mp3 и 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 

Этот скрипт работает под zsh с небольшими изменениями: замените shopt -s dotglob globstar на setopt dot_glob и [[ $target -ot $source ]] на [[ ! -e $target || $target -ot $source ]] [[ ! -e $target || $target -ot $source ]] [[ ! -e $target || $target -ot $source ]] .

Если он предназначен для резервного копирования, просто спрячьте архив. Никакое имя файла не так.

  • Почему мой rsync замедляется со временем?
  • rsync: Как я могу вытащить файл -exclude-from из удаленного хоста?
  • Rsync не может удалить удаленный файл не существует в локальном
  • Как заставить rsync перезаписывать архивные файлы только для чтения?
  • rsync несколько файлов из нескольких каталогов в Linux
  • Исполняемый файл не «действительно существует» после rsync
  • rsync -delete-excluded с -prune-empty-dirs, но только обрезанные исключенные каталоги
  • rsync: mix исключить и включить фильтры
  • Rsync копирует все снова, а не дельта
  • «Ndd» эквивалент «ethtool» в Solaris
  • rsync-сервер и клиентская проблема
  • Linux и Unix - лучшая ОС в мире.