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

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

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

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

Спасибо

12
задан 9 November 2010 в 18:46

4 ответа

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

0
ответ дан 9 November 2010 в 18:46

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

0
ответ дан 9 November 2010 в 18:46

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

0
ответ дан 9 November 2010 в 18:46

Самый простой подход - использовать уровень файловой системы для преобразования имен файлов. Начиная с Ubuntu 12.04, существует файловая система FUSE , которая преобразует имена файлов в имена, поддерживаемые VFAT Windows: fuse-posixovl Install fuse-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 в тексте замены соответствуют выражениям в скобках (**/) и *. (** теряет свое специальное значение как ноль или более уровней подкаталогов, если оно в скобках, если только скобки не содержат точно **/.)

Я изначально думал использовать [ 1171] pax , который является инструментом архивации (здесь предназначен для использования в сквозном режиме), который имеет функцию переименования файлов (его опция -s). Однако опции -s и -u не работают вместе (определение pax pax буквально говорит, что -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/
0
ответ дан 9 November 2010 в 18:46

Другие вопросы по тегам:

Похожие вопросы: