Как заменить двоеточия при rsync на USB-ключе?

12

Я хотел бы сделать резервную копию моего почтового каталога на USB-ключ. Тем не менее, в моем IMAP есть странное соглашение об именах, в котором есть символ двоеточия (:). Поскольку USB имеет формат окна, rsync не может создать этот файл. Есть ли способ заменить символ двоеточия подчеркиванием при запуске rsync? (Или сделать такую ​​же синхронизацию с другим инструментом?)

Несколько моментов, которые я пояснил в комментариях:

  • Это резервное копирование сценария наихудшего случая , я хотел бы иметь возможность читать его на компьютере с Windows, не устанавливая ничего.
  • Я получил много данных, которые остаются неизменными. Поэтому я экономлю много времени, если у меня есть инструмент, который просто копирует новые файлы.
  • Я не ищу переписать Rsync. Я ищу существующий инструмент, который можно использовать из коробки.

Благодарность

Гийом Котэ
источник

Ответы:

8

Используйте rdiff-backup вместо простого rsync. Он автоматически обнаружит и заменит символы, которые не поддерживаются на целевом диске, а также вернет их обратно, как они были при восстановлении в файловой системе Unix. Он создает распакованный каталог, который выглядит так же, как источник плюс один дополнительный каталог метаданных.

poolie
источник
6

Самый простой подход - использовать уровень файловой системы для преобразования имен файлов. Начиная с Ubuntu 12.04, существует файловая система FUSE, которая преобразует имена файлов в имена, поддерживаемые VFAT в Windows: fuse-posixovl Установите предохранитель-posixovl .

sudo mount.posixovl /media/sdb1
chown guillaume /media/sdb1
rsync -au ~/mail /media/sbd1/

Или чтобы не требовать root-доступа:

mkdir ~/mnt
/sbin/mount.posixovl -S /media/sdb1 ~/mnt
rsync -au ~/mail ~/mnt/

Символы в именах файлов, VFAT не принимает кодируются как %(XX)где XXесть шестнадцатеричные цифры. Начиная с POSIXovl 1.2.20120215, имейте в виду, что имя файла наподобие %(3A)закодировано как само по себе и будет декодировано как :, поэтому существует риск конфликта, если у вас есть имена файлов, содержащие подстроки формы %(XX).

Помните, что POSIXovl не справляется с слишком длинными именами файлов. Если закодированное имя не помещается в 255 символов, файл не может быть сохранен.

POSIXovl хранит разрешения и владение Unix в вызываемых файлах .pxovl.FILENAME.


Следующий скрипт bash ≥4 копирует ~/mail/foo:barв /media/usb99/mail/foo_bar, и аналогично для всех файлов в ~/mail. Файлы, которые уже существуют в дереве назначения и не старше источника, пропускаются.

#!/bin/bash
set -e
shopt -s dotglob globstar
for source in "$HOME"/mail/**/*; 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 ]].


Вот двухстрочный zsh (три, если считать автозагрузки). Он короче, но довольно продвинутый и не очень читаемый.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • zargsЛиния эквивалентна mkdir -p ~/mail/**/*(…), за исключением того, что он не будет бомбить, если общая длина имен каталогов слишком долго. Эта строка создает целевые каталоги по мере необходимости.
  • ~/mail/**/*(/)расширяется до всех каталогов в ~/mail(каталоги только из- (/)за в конце).
  • (/e\''…'\')выбирает только каталоги и далее выполняет код внутри «…» для преобразования каждого имени файла, которое хранится в REPLYпеременной.
  • ${${REPLY#$HOME/}//:/_}удаляет префикс, соответствующий исходному каталогу, и изменяется :на _.
  • zmv -C копирует каждый файл, соответствующий его первому операнду (шаблон zsh), в имя файла, полученное путем расширения его второго операнда.
  • -o -puговорит, чтобы перейти -puк cpутилите, чтобы сохранить права и копировать только обновленные файлы. (Мы могли бы попросить zsh выполнить проверку обновления; это было бы немного быстрее, но еще более загадочно.)
  • (.)выбирает только обычные файлы. -Qговорит, что это должно быть проанализировано как глобальный квалификатор, а не как .с круглыми скобками, указывающими на подвыражение.
  • $1и $2в тексте замены соответствуют выражения в скобках (**/)и *. ( **теряет свое специальное значение как ноль или более уровней подкаталогов, если он указан в скобках, если только скобки не содержат точно **/.)

Сначала я подумал об использовании pax , который является инструментом архивации (здесь предназначенным для использования в сквозном режиме), который имеет функцию переименования файлов (ее -sопция). Тем не менее, -sи -uварианты не работают вместе ( определение POSIX - во человек буквально говорит , что -uнеобходимо проверить файл с тем же именем в целевом дереве, а не имя файла преобразованной -s; реализация PAX в Ubuntu следует спецификации буквально , а не полезно). Все еще возможно использовать его для создания переименованных жестких ссылок, а затем скопировать жесткие ссылки (с помощью rsync -auили pax -rw -pp -u) на другой носитель, но это доставляет больше хлопот, чем стоит.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/
Жиль "ТАК - перестань быть злым"
источник
Я собираюсь попробовать использовать Pax. Возможно, вы могли бы улучшить свой ответ, указав пакет, необходимый в Ubuntu. Кажется, это не является частью обычной установки.
Гийом Котэ
Просто добавив один пакет под названием pax, он заработает.
Гийом Котэ
Он ничего не выводит, я пытаюсь добавить опцию -v, чтобы посмотреть, что происходит. Кажется, что все копирует каждый раз. Смысл rsync в том, чтобы быть инкрементным, что позволило мне сэкономить много времени, когда у меня просто несколько измененных файлов в середине большого количества файлов.
Гийом Котэ
Кажется, создается домашний каталог по указанному мною пути. Рекомендуется избегать изменения каталога в скрипте, есть ли другая возможность избежать создания всех этих каталогов?
Гийом Котэ
На втором проходе прошло пять минут, где все было идентично. rsync заняло бы всего несколько секунд. Есть ли параметр, который нужно указать, чтобы сделать его инкрементным?
Гийом Котэ
-1

Что я делаю с моей картой памяти USB и мобильным USB-диском, так это разделю их на 2 раздела: один FAT32 и ext4. Первый из них я могу использовать для обмена данными с не-linux пользователями, второй - для личного использования с моими системами Ubuntu (и, возможно, для обмена с другими пользователями linux). В разделе ext4 у вас не будет проблемы ":".

Janc
источник
Я хотел бы, чтобы моя резервная копия была доступна для чтения в любом месте на случай, если мне понадобится информация на компьютере с Windows. Если нет, я бы переформатировал USB-ключ для файловой системы Unix. Вот почему я спрашиваю о замене.
Гийом Котэ
Что ж, это можно прочитать по крайней мере , ext2 / ext3 на Windows , если установить некоторые инструменты или драйверы файловой системы. Хотите ли вы иметь возможность читать его в каждой системе Windows или только в ваших собственных системах (где вы можете установить необходимые инструменты, если они вам нужны)?
Янв
КСТАТИ: теоретически должно быть возможно сохранить его и в системе NTFS, но большинство приложений Windows (включая большинство из Microsoft) не поддерживают NTFS правильно ...: P
JanC
Это резервная копия восстановления в худшем случае, поэтому я хочу быть готовым к тому случаю, когда мне нужно что-то быстрое, у меня нет права устанавливать что-либо на компьютер.
Гийом Котэ
-2

Вы можете использовать tarдля создания архива. Таким образом, вам не нужно менять имена и сохранять их в любой файловой системе.

Дэвид
источник
Я мог бы сделать то же самое с zip-файлом или tgz, но он собирается переписать файл, который не менялся каждый раз. Поскольку носитель записан в ограниченном количестве, и я получил несколько Gib данных, я бы хотел избежать перезаписи всего этого только потому, что был добавлен новый файл размером 1 КБ.
Гийом Котэ
Перезаписи на недавней флэш-памяти «ограничены» количеством миллионов или, по крайней мере, сотнями тысяч. Я сомневаюсь, что вы планируете сделать так много резервных копий. ;)
JanC
2
-1 -azv не создает архив, он копирует в режиме архива, что означает, что он поддерживает атрибуты файла
João Pinto
sry, действительно думал, что rsync может сделать это, изменил на tar, но я не знаю, может ли tar делать инкрементные резервные копии. Однако JanC прав, и переписывание не должно быть проблемой.
Дэвид
Что касается комментариев JanC о переписываниях, то это не только тот факт, что есть предел (в прошлый раз, когда я проверяю, оно было ближе к тысяче, чем миллиону), но и тот факт, что я не люблю ждать несколько часов чего-то, что должно быть меньше минуты.
Гийом Котэ