Я ищу простой способ сделать резервную копию файлов, которые изменились за последние 24 часа, и создать ежедневный 7zip-файл (мне не нужны permssion или пользователи, просто файлы).

Используя следующую команду, я могу передать список измененных файлов в 7Zip, и это хорошо работает. Однако информация о пути измененных файлов не сохраняется в 7zip.

/usr/bin/find /local-storage/public_html/ -type f -size -25M -mtime -1 -print | /usr/bin/xargs -n 1 /usr/bin/7z a -t7z -m0=lzma -mx=9 /local-storage/public_html_2013-09-03.7z

Так что, если я сейчас попытаюсь извлечь этот 7zip-файл, он будет всего в 1 каталоге и без путей.

Надеюсь, кто-то здесь может указать, что я пропустил :-)

3 ответа3

1

Я не уверен, что 7z может сделать это, это то, что они имеют в виду в этом разделе справочной страницы:

   On Linux/Unix, in order  to  backup  directories  you
   must use tar :
    -  to backup a directory  : tar cf - directory | 7za a -si directory.tar.7z
    -  to  restore  your  backup  :  7za  x  -so  directory.tar.7z | tar xf -

Вместо этого я бы предложил создать несжатый тарный шар, а затем сжать его с помощью 7z:

find /local-storage/public_html/ -type f  -mtime -1 -print0 | 
xargs --null tar rf foo.tar && 
7za a -t7z -m0=lzma -mx=9 /local-storage/public_html_2013-09-03.tar.7z foo.tar &&
rm foo.tar

Это создаст файл с именем public_html_2013-09-03.tar.7z который будет содержать tar-шар foo.tar . Затем вы можете извлечь все и сохранить правильные пути (каталоги будут созданы, если их нет, а файлы будут перезаписаны, поэтому убедитесь, что вы знаете, что делаете):

7z x -so foo.tar.7z | tar rf -
0

Кажется, 7z не особенно подходит для того, что вы пытаетесь сделать. Тем не менее, если вы используете 7z , вы все равно можете делать то, что вам нужно, создавая временное дерево файлов и создавая из него архив. Например, вы можете поместить этот список команд в скрипт оболочки:

cd /tmp
find /local-storage/public_html -type f -size -25M -mtime -1 -print0 | xargs -0 tar -rf public_html_2013-09-03.tar
tar -xf public_html_2013-09-03.tar
7z a -r -t7z -m0=lzma -mx=9 /local-storage/public_html_2013-09-03.7z local-storage
rm -rf local-storage public_html_2013-09-03.tar

Это основная идея. Обратите внимание, что -r передано в 7z . Это можно улучшить, улучшив обработку временного каталога, автоматически создавая строку даты и т.д.

0

Спасибо всем за ваш вклад. Я нашел метод, который пока не очень хорош для меня в моей ситуации. Я использовал некоторые идеи из постеров и создал следующий скрипт bash.

#!/bin/bash
TIMESINCELINUXSTART="$(date +%s)"
YESTERDAY=`date -d "1 days ago" '+%Y-%m-%d'`
cd /local-storage/public_html/
/usr/bin/find . -type f -size -25M -mtime -1 > /tmp/"$TIMESINCELINUXSTART"-changed-files.txt
/bin/mkdir -p /tmp/"$TIMESINCELINUXSTART"/public_html
/usr/bin/rsync --files-from=/tmp/"$TIMESINCELINUXSTART"-changed-files.txt /local-storage/public_html /tmp/"$TIMESINCELINUXSTART"/public_html/
/usr/bin/7z a -t7z -m0=lzma -mx=9 /local-storage/snapshots/public_html-changes-during-"$YESTERDAY".7z /tmp/"$TIMESINCELINUXSTART"/public_html
/bin/rm /tmp/"$TIMESINCELINUXSTART"-changed-files.txt
/bin/rm -rf /tmp/"$TIMESINCELINUXSTART"

Если у кого-то есть улучшения или комментарии по этому поводу, вам предлагается прокомментировать. Единственное дополнение, которое я хотел бы добавить, чтобы не создавать 7zip-файл, если не найдено никаких измененных файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .