Как заменить двоеточия при rsync на USB-ключе?
Я хотел бы сделать резервную копию моего почтового каталога на USB-ключ. Однако в моем IMAP есть странное соглашение об именах, в котором есть символ двоеточия (:). Поскольку USB имеет формат окна, rsync не может создать этот файл. Есть ли способ заменить двоеточие символом подчеркивания при запуске rsync? (Или сделать такую же синхронизацию с другим инструментом?)
Несколько моментов, которые я пояснил в комментариях:
- Это резервное копирование сценария наихудшего случая, я хотел бы иметь возможность читать его на компьютере с Windows, не устанавливая ничего.
- Я получил много данных, которые остаются неизменными. Поэтому я экономлю много времени, если у меня есть инструмент, который просто копирует новые файлы.
- Я не ищу переписать Rsync. Я ищу существующий инструмент, который можно использовать из коробки.
Спасибо
4 ответа
Используйте rdiff-backup вместо простого rsync. Он автоматически обнаружит и заменит символы, которые не поддерживаются на целевом диске, а также вернет их обратно, как они были при восстановлении в файловой системе Unix. Он создает распакованный каталог, который выглядит так же, как источник плюс один дополнительный каталог метаданных.
Самый простой подход - использовать уровень файловой системы для преобразования имен файлов. Начиная с Ubuntu 12.04, существует файловая система FUSE, которая преобразует имена файлов в имена, которые поддерживает VFAT в Windows: 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
в тексте замены соответствуют выражения в скобках(**/)
а также*
, (**
теряет свое особое значение как ноль или более уровней подкаталогов, если он находится в скобках, если только скобки не содержат точно**/
.)
Сначала я подумал об использовании pax, который является инструментом архивации (здесь предназначен для использования в сквозном режиме), который имеет функцию переименования файлов (его -s
опция). Тем не менее -s
а также -u
опции не работают вместе ( определение pax в 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/
Что я делаю с моей картой памяти USB и мобильным USB-диском, так это разделю их на 2 раздела: FAT32 и ext4. Первый из них я могу использовать для обмена данными с не-linux пользователями, второй - для личного использования с моими системами Ubuntu (и, возможно, для обмена с другими пользователями linux). В разделе ext4 у вас не будет проблемы ":".
Вы могли бы использовать tar
создать архив. Таким образом, вам не нужно менять имена и сохранять их в любой файловой системе.