Назад | Перейти на главную страницу

Как заархивировать множество папок в три + независимых zip-файла?

у меня есть массивный количество папок, и я хочу заархивировать / gzip / (что угодно) их в 3 или более независимых файла.

Так, например, скажем, у меня есть эти каталоги на моем сервере:

/dir1
/dir2
/dir3
/dir4
/dir5
/dir6

Мне нужно как-то заархивировать их в 3 отдельных zip-файла. Это будет выглядеть так:

collection1.zip

/dir1
/dir2
/dir3

collection2.zip

/dir4
/dir5
/dir6

collection3.zip

/dir7
/dir8
/dir9

Извините, у меня недостаточно нового кредита, чтобы просто прокомментировать. Но что-то подобное должно помочь вам с архивированием папок.

#! /bin/bash
DIR=$1
i=0
arr=()
zipnum=0
cd $DIR
for item in *
do
    if [[ -d $item ]]; then
            if [ $i -lt 2 ]; then 
                    arr+=($item)
                    ((i++))
            else
                    arr+=($item)
                    zip ${arr[@]} $zipnum
                    ((zipnum++))
                    i=0
                    arr=()
            fi
    fi
done
((zipnum++))
zip ${arr[@]} $zipnum

Он должен работать (не было времени его протестировать). Сохраните файл как zip.sh и запустите его как ./zip.sh / your / directory / здесь. Что касается передачи файлов, не могли бы вы просто установить ftp-клиент на сервер и ftp файлы?

Приведенный ниже сценарий был протестирован на CentOS 6.5.

Просматривает файлы в указанной папке и добавляет их один за другим в zip-архив (ы) не больше указанного максимального размера. Добавление файлов в zip-архив по одному может вызвать скачки ввода-вывода ЦП или хранилища:

#!/bin/bash

files_folder="/home/username/public_html/"
zip_folder="/home/username/"
zip_maxsize=524288000  # 500 MB

zip_prefix="archive"
zip_suffix=0

cd ${files_folder}

for FILE in $(find . -type f); do
    zip_file="${zip_folder}${zip_prefix}-${zip_suffix}.zip"
    if [ -f ${zip_file} ]; then
        zip_size=$(ls -l ${zip_file} |cut -d' ' -f5)
    fi
    file_size=$(ls -l ${FILE} |cut -d' ' -f5)
    comb_size=$((zip_size + file_size))
    if [ ${comb_size} -gt ${zip_maxsize} ]; then
        zip_suffix=$((zip_suffix + 1))
        zip_file="${zip_folder}${zip_prefix}-${zip_suffix}.zip"
    fi
    zip -q ${zip_file} ${FILE}
done

Я нашел простое решение.

Сначала я составил список всех папок, которые мне нужно заархивировать:

ls > list.txt

Чем я удалил ./ и ../ из списка.

После этого я разделил этот список с помощью текстового редактора на 5 разных файлов, например. listPart1, listPart2, listPart3 ...

Я поместил эти списки в папку, содержащую все папки, которые необходимо заархивировать, и выполнил эту команду из этой папки для каждого списка:

cat listPart1 | zip -r@ part1.zip