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


12

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

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

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

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

Ответы:


8

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


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 у вас не будет проблемы ":".


Я хотел бы, чтобы моя резервная копия была доступна для чтения в любом месте на случай, если мне понадобится информация на компьютере с 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 о переписываниях, то это не только тот факт, что есть предел (в прошлый раз, когда я проверяю, оно было ближе к тысяче, чем миллиону), но и тот факт, что я не люблю ждать несколько часов чего-то, что должно быть меньше минуты.
— Гийом Котэ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.