Criando um arquivo zip com timestamp

3

Eu tenho tentado criar um script que comprime um diretório com um timestamp e movê-lo para outro local no mesmo servidor, mas não consigo obter o TESTDATE para exibir no arquivo zip, resultando no nome do arquivo .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
    
por Reqx 05.03.2014 / 17:08

1 resposta

5

Você tem vários problemas aí.

  • Primeiro, você deseja atribuir o resultado do comando date +%b-%d-%y à variável TESTDATE . Para fazer isso, você precisa usar a substituição de comando :

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

    O que seu script está fazendo atualmente é atribuir a string date +%b-%d-%y a TESTDATE , não o resultado do comando. Você pode testar executando isto:

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

    , que imprimirá date +%b-%d-%y .

  • Segundo, você está usando a substituição de comandos onde você não deveria, o que você quer é:

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

    Então, você não quer os parênteses. Eu também não tenho idéia do que você está tentando fazer com basename lá. basename é um programa padrão e você não precisa colocá-lo em uma variável para usá-lo. O comando acima define zipfile como /volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basename , que não é um nome de arquivo válido. Se você explicar o que está tentando fazer com o basename, talvez possa ajudar, mas, como é, não faz sentido.

  • Você parece achar que DIRS é uma lista, não é, é apenas o diretório único /volume1/NetBackup .

  • Outro ponto é uma questão de estilo. Você deve sempre evitar o uso de nomes de variáveis CAPITAL, pois as variáveis ambientais são todas em maiúsculas e isso pode causar problemas se você usar o mesmo nome.

De qualquer forma, se eu entendo o que você está tentando fazer aqui, você poderia escrever o script assim (eu fiz dirs em um array já que acho que é o que você queria):

#!/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

O script de exemplo acima criaria /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zip e /volume1/NetBackup/Backup/Mar-05-14 foobar.zip . A propósito, eu também sugiro strongmente que você evite criar nomes de arquivos com espaços, você me agradecerá mais tarde.

    
por 05.03.2014 / 17:44