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 не может выбрать правильный целевой каталог
  • Кэширование записывает изменения на SSD, чтобы избежать разгона HDD? ZFS, но (возможно) не L2ARC
  • Как проверить быстрый вывод rsync
  • rsync репозиторий OpenIndiana на локальном сервере
  • Резервное копирование Windows-ПК на Linux-машину
  • Rsync исключает папки
  • рекурсивно синхронизировать только определенные файлы из определенных подкаталогов с удаленного сервера
  • Файлы Rsync - из проблемы
  • Может ли rsync обнаруживать изменения в собственнике / группе или perms?
  • Linux и Unix - лучшая ОС в мире.