LINUX.ORG.RU
ФорумAdmin

[tar] добавить только новые файлы в сжатый архив

 


0

0

Пишу скрипт, который рекурсивно обходит директории и создает в них архивный файл tar, пожатый bzip2, для всех файлов по маске *.txt

Что хотелось бы:
- если архива нет, то он создается (легко)
- если архив есть, то добавить в него только новые файлы -- те, которые изменились с момента последнего архивирования (проблема, ниже)

У tar'а есть специальный режим работы 'udpdate', ключ -u, который как раз отвечает требованиям. Но он не работает для сжатых архивов. Т.е. мне нужно сначала сделать `bunzip2 archive.tar.bz2`, затем `tar -uf archive.tar *.txt`, и затем опять `bzip2 archive.tar`.

Вопрос: можно ли избежать подобных (нерациональных) телодвижений?

anonymous

А смысл сжимать, часто обновляемый архив, находящийся на диске.
Сжимай, если место экономишь, при сбросе архива на внешний носитель (dvd, лента, ...)

sdio ★★★★★
()

Кстати, сам скрипт (может он тоже крив, чисто логически?  Не тестил):

#!/bin/bash

TARGET_DIR=/srv/ftp/dir

# рекурсиё
Main() {
    for dir in "$1"/*; do
        if [ -d "$dir" ]; then
            cd "$dir"
            Main "$dir"

            # Actions:
            # Здесь должен быть ожидаемая tar-команда, пока что заменена на этот костыль:
            CompressTxt
            #

            cd -
        fi
    done
}

# Создает архив вида $prevdir-$curdir-txt.tar.bz2, где
#  - prevdir: имя предыдущей директории
#  - curdir: имя текущей директории, если
# время изменения хотя бы одного файла больше чем самого архива
CompressTxt() {
    prevdir="$( cd .. && basename $PWD )"
    curdir="$( basename $PWD )"
    name_ar="${prevdir}-${curdir}-txt.tar.bz2"

    if ! ls *.txt &> /dev/null; then
        return
    fi

    if [ -f "$name_ar" ]; then
        time_last_mod_ar=$( stat -c %Y "$name_ar" )
        for txt in *.txt; do
            time_last_mod_txt=$( stat -c %Y "$txt" )
            if [ $time_last_mod_txt -gt $time_last_mod_ar ]; then
                rm "$name_ar"
                break
            fi

            return
        done
    fi

    tar -cjf "$name_ar" *.txt
}
        
Main "$TARGET_DIR"

anonymous
()
Ответ на: комментарий от sdio

> А смысл сжимать, часто обновляемый архив, находящийся на диске. Сжимай, если место экономишь, при сбросе архива на внешний носитель (dvd, лента, ...)

А, объясню.

*.txt -- это файлы лекций, которые лежат на фтп. Чтобы их все по отдельности не скачивать, я подумал, что хорошо было бы создать архив.

Планировалось, что the скрипт будет запускаться по крону раз в сутки.

anonymous
()
Ответ на: комментарий от anonymous

А то что измененные файлы _добавляются_, а не заменяются в архиве, т.е. в архиве будут все версии файла, тебе известно?

sdio ★★★★★
()
Ответ на: комментарий от sdio

Действительно, я перепутал с -d (что, кстати, просто выводит статус различия, afaiu).

Печально, видимо придется в очередной раз городить костыли. Что странно, учитывая что задача на вид довольно типовая.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.