Создание очень длинных включений и исключений rsync с помощью Python

Я пытаюсь запустить резервную копию всех моих .x-папок в Home для сохранения конфигураций.

С помощью программы, которую я пишу, вы можете выбрать любые папки, которые вы хотите включить или исключить из

Я пытаюсь создать что-то вроде этого:

rsync -aP --exclude $Home/.cache/google-chrome/Default/Cache/* --exclude $Home/.cache/google-chrome/Default/Media\ Cache/* --exclude $Home/.wine $HOME/.* /mnt/ext/

Итак, в приведенном выше примере все копируется на внешний диск, за исключением Wine и кеши Chrome. Я знаю, что я могу создать текстовый файл и сказать rsync --exclude-from 'textfile', но мне больше не нужно читать и переписывать текстовый файл.

Мое беспокойство заключается в том, что, поскольку это расширяется, список исключений может получится довольно долго, так как мой проект в конечном итоге начнет включать папки за пределами $ HOME, а также на другие системы NFS. Я могу запустить эту команду и использовать список исключений в переменной:

exlist = "--exclude $Home/.cache/google-chrome/Default/Cache/* --exclude $Home/.cache/google-chrome/Default/Media\ Cache/* --exclude $Home/.wine" etc etc
subprocess.Popen("rsync -options ",exlist," /source /dest")

Но это вызовет проблемы с чрезвычайно длинными командами оболочки, где мне придется разбить его на более мелкие куски? Я предпочел бы опережать потенциальные будущие проблемы и начинать писать обработчики, чтобы выполнить это сейчас, вместо того, чтобы пытаться исправить и исправить его позже.

1
задан 28 June 2016 в 18:56

1 ответ

Я знаю, что я могу построить текстовый файл и сказать rsync --exclude-from 'textfile, но мне лучше не читать и переписывать текстовый файл.

Просто выполните:

with contextlib.closing(tempfile.NamedTemporaryFile()) as exclude_from:
    print(*your_exclude_list, sep="\n", flush=True, file=exclude_from)  # etc
    subprocess.check_call(['rsync', '--exclude-from', exclude_from.name, ...])

... и не беспокойтесь о временном файле. Я ценю, что временные файлы кажутся беспорядочными, но с библиотекой Python и менеджерами контекста все это может быть красиво завернуто в посылку с луком, поэтому вам не нужно беспокоиться об этом.

0
ответ дан 23 May 2018 в 08:58
  • 1
    Это также должно работать, однако система будет заполнена только для чтения, и поскольку она получит свою инструкцию по сети через tcp, я не хочу ничего писать на локальный диск. Резервные копии будут иметь источник и адресаты по системе NFS. Я надеюсь свести к минимуму эту систему во что-то настолько маленькое, насколько возможно, возможно, RaspberryPi или меньше. – Dorian 28 June 2016 в 18:22
  • 2
    Просто установите tmpfs. Что-то вроде mkdir -p /tmp/tmpfs; mount -t tmpfs none /tmp/tmpfs; export TMPDIR=/tmp/tmpfs. Или, учитывая, что вся ваша система доступна только для чтения, вы, вероятно, хотите, чтобы /tmp сам был tmpfs. Вы можете настроить /etc/fstab, чтобы это произошло автоматически. Обычно материал ожидает рабочий временный каталог. Если у вас его нет, ваша программа Python может быть прекрасной, но другие вещи могут сломаться. Так что вам лучше всего это делать, независимо от того, используете ли вы это решение или нет. – Robie Basak 29 June 2016 в 14:25
  • 3
    Спасибо за этот обходной путь, и я, вероятно, буду использовать его в другой сборке. Но этот, как я сказал, заперт и очень минимален. Вся ОС будет работать с флеш-накопителем, поэтому я не хочу писать вообще. Сеть будет очень ограничена, и ничто другое не будет работать, кроме моей программы python, rsync и ssh-сервера, чтобы я мог войти в систему, поэтому меня не беспокоят никакие программы, которые не могут писать где-нибудь, и я буду делать все в памяти. – Dorian 29 June 2016 в 17:29
  • 4
    tmpfs - это файловая система памяти - она ​​вообще не связана с записью на диск (если вы не используете swap, что, предположительно, нет). – Robie Basak 29 June 2016 в 20:03

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

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