Initial commit

This commit is contained in:
wn6
2026-05-31 13:41:47 +07:00
commit 4da6d7c368
3 changed files with 164 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
# Bitrix Backup Download & Extract
Утилиты для скачивания и извлечения резервных копий Bitrix, разбитых на части на HTTP-сервере.
## Описание
Резервные копии Bitrix иногда хранятся на веб-сервере в виде одного файла (или набора `.tar.gz`-архивов), разбитого на части с числовыми суффиксами:
```
backup.tar.gz
backup.tar.gz.1
backup.tar.gz.2
...
```
Этот репозиторий содержит два скрипта:
- **download_backup.sh** — скачивает базовый файл и все его части с сервера
- **extract_backup.sh** — собирает части в один файл и распаковывает архив
## Требования
- `bash`
- `curl`
- `tar`
## Использование
### 1. Скачивание
```bash
./download_backup.sh <base_url> [output_dir]
```
**Параметры:**
- `base_url` — полный URL до базового файла (без числового суффикса)
- `output_dir` — директория для сохранения (по умолчанию: текущая)
**Пример:**
```bash
./download_backup.sh https://example.com/backup.tar.gz ./downloads
```
Скрипт скачает `backup.tar.gz`, затем проверит наличие `backup.tar.gz.1`, `backup.tar.gz.2` и т.д. пока сервер не вернёт код, отличный от 200.
### 2. Распаковка
```bash
./extract_backup.sh <input_dir> [output_dir]
```
**Параметры:**
- `input_dir` — директория с частями `.tar.gz`
- `output_dir` — директория для извлечения (по умолчанию: текущая)
**Пример:**
```bash
./extract_backup.sh ./downloads ./restored
```
Скрипт:
1. Определяет префикс файла (например, `backup.tar.gz`) по первому найденному `.tar.gz` файлу
2. Собирает части в правильном порядке во временный файл
3. Распаковывает архив через `tar -xzf`
4. Удаляет временный файл при успешном завершении
## Лицензия
MIT
+45
View File
@@ -0,0 +1,45 @@
#!/bin/bash
BASE_URL="${1}"
OUTPUT_DIR="${2:-.}"
if [ -z "$BASE_URL" ]; then
echo "Usage: $0 <base_url> [output_dir]"
exit 1
fi
# Скачиваем базовый файл
echo "Downloading base file..."
curl -L -f -o "${OUTPUT_DIR}/$(basename "$BASE_URL")" "$BASE_URL"
if [ $? -ne 0 ]; then
echo "Failed to download base file."
exit 1
fi
# Скачиваем части, пока они существуют
i=1
while true; do
PART_URL="${BASE_URL}.${i}"
# Проверяем существование файла через HEAD-запрос
HTTP_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" -I "$PART_URL")
if [ "$HTTP_CODE" -ne 200 ]; then
echo "No more parts found (last checked: ${PART_URL}). Download complete."
break
fi
OUTPUT_FILE="${OUTPUT_DIR}/$(basename "$PART_URL")"
echo "Downloading part ${i}: ${PART_URL}..."
curl -L -f -o "$OUTPUT_FILE" "$PART_URL"
if [ $? -ne 0 ]; then
echo "Failed to download part ${i}: ${PART_URL}"
exit 1
fi
i=$((i + 1))
done
echo "All files downloaded successfully."
+46
View File
@@ -0,0 +1,46 @@
#!/bin/bash
INPUT_DIR="${1:-.}"
OUTPUT_DIR="${2:-.}"
if [ -z "$1" ]; then
echo "Usage: $0 <input_dir> [output_dir]"
echo "Concatenates all .tar.gz parts and extracts them"
exit 1
fi
PREFIX=""
for f in "${INPUT_DIR}"/**.tar.gz; do
if [ -f "$f" ]; then
BASE=$(basename "$f")
# Убираем числовой суффикс для определения префикса
PREFIX=$(echo "$BASE" | sed -E 's/\.[0-9]+$//')
if [ -n "$PREFIX" ]; then
break
fi
fi
done
COMBINED="/tmp/${PREFIX}_combined.tar.gz"
echo "Combining parts into ${COMBINED}..."
# Собираем в правильном порядке: сначала базовый файл (без суффикса), затем части по порядку
cat "${INPUT_DIR}/${PREFIX}" > "$COMBINED" 2>/dev/null
for f in $(ls -v "${INPUT_DIR}/${PREFIX}".* 2>/dev/null); do
BASE=$(basename "$f")
if [[ "$BASE" =~ \.[0-9]+$ ]]; then
echo "Appending ${BASE}..."
cat "$f" >> "$COMBINED"
fi
done
echo "Extracting ${COMBINED} to ${OUTPUT_DIR}..."
tar -xzf "$COMBINED" -C "$OUTPUT_DIR"
if [ $? -eq 0 ]; then
echo "Extraction complete."
rm -f "$COMBINED"
else
echo "Extraction failed. Combined file kept at ${COMBINED}"
exit 1
fi