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


8

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

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

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

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

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

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

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


Прежде всего, почему вы не можете переформатировать USB-накопитель и почему у вас есть имена файлов с двоеточиями и вопросительными знаками в них? Несмотря на то, что эти символы разрешены файловой системой на исходном диске, они, как правило, проблематичны для работы оболочки и переносимости. Кроме того , rsync«s --iconvвариант не сделал для того, что вы пытаетесь использовать его для.
depquid

1
@depquid проблема только в работе с оболочкой, если вы пишете глючный код оболочки.
Иордания

@jordanm Я больше думал об использовании интерактивной оболочки. Конечно, это можно сделать, но работать с более стандартными символами удобнее, ИМХО.
depquid

1
К вашему сведению, --iconvвыполняет преобразования набора символов, например, latin1 <-> utf8. Не то, что вы ищете.
Дероберт

Ответы:


4

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

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

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


2

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


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

3
@atorgovitsky Вы должны отредактировать свой оригинальный вопрос, чтобы предоставить эти детали.
depquid
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.