Создание zip-файла с временной меткой

Создание zip-файла с временной меткой

Я пытаюсь создать скрипт, который сжимает каталог с меткой времени и перемещает его в другое место на том же сервере, но мне не удаётся отобразить TESTDATE в zip-файле, в результате чего имя файла становится .zip.

#!/bin/sh

# date
TESTDATE="date +%b-%d-%y"

# dirs to backups
DIRS="/volume1/NetBackup"

# Save zip file elsewhere on the server
DEST="/volume1/NetBackup/Backup"

# set to "no" keep old zip file and add new file
DELETE_OLD_ZIP_FILES="no"

#Path to binary files
BASENAME=/usr/bin/basename
ZIP=/usr/syno/bin/zip

for d in $DIRS
do
echo $DIRS
    zipfile="${DEST}/$(${TESTDATE} ${d} ${BASENAME}).zip"
    echo -n "Creating $zipfile..."
            # create zip file
                ${ZIP} -r $zipfile $d &>/dev/null && echo "Done!"
                done

решение1

У вас там разные проблемы.

  • Сначала вы хотите присвоить результат команды date +%b-%d-%yпеременной TESTDATE. Для этого вам нужно использоватьзамена команды:

    TESTDATE=$(date  +%b-%d-%y)
    

    Ваш скрипт в данный момент присваивает строку date +%b-%d-%y, TESTDATEа не результат команды. Вы можете проверить, запустив это:

    TESTDATE="date +%b-%d-%y"
    echo $TESTDATE 
    

    который будет печатать date +%b-%d-%y.

  • Во-вторых, вы используете подстановку команд там, где не следует, а вам нужно:

      zipfile="${DEST}/${TESTDATE} ${d} ${BASENAME}.zip"
    

    Итак, вам не нужны скобки. Я также понятия не имею, что вы пытаетесь сделать с basenameэтим. basename— это программа по умолчанию, и вам не нужно помещать ее в переменную, чтобы использовать ее. Команда выше устанавливает zipfile в /volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basenameто, что не является допустимым именем файла. Если вы объясните, что вы пытаетесь сделать с basename, я, возможно, смогу помочь, но в таком виде это не имеет смысла.

  • Вы, кажется, думаете, что DIRSэто список, но это не так, это просто один каталог /volume1/NetBackup.

  • Другой момент — вопрос стиля. Вам следует всегда избегать использования заглавных букв в именах переменных, поскольку переменные окружения полностью состоят из заглавных букв, и это может привести к проблемам, если вы используете то же имя.

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

#!/usr/bin/env bash

# date
testdate=$(date +%b-%d-%y)

# dirs to backup
dirs=("/volume1/NetBackup" "/volume1/foobar")

# Save zip file elsewhere on the server
dest="/volume1/NetBackup/Backup"

# set to "no" keep old zip file and add new file
delete_old_zip_files="no"

#Path to binary files
zip=/usr/syno/bin/zip

base=$(/usr/bin/basename ${dest})
echo "bb $base";

for d in ${dirs[@]}
do
    ## I assume this is what you wanted to do, it will just
    ## return the name of the current $d directory
    base=$(/usr/bin/basename ${d})
    zipfile="${dest}/${testdate} ${base}.zip"
    echo -n "Creating $d $zipfile..."
    # create zip file
    ${zip} -r $zipfile $d  && echo "Done!" || echo ""
done

Пример скрипта выше создаст /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zipи /volume1/NetBackup/Backup/Mar-05-14 foobar.zip. Кстати, я также настоятельно рекомендую вам избегать создания имен файлов с пробелами, позже вы скажете мне спасибо.

Связанный контент