Criando um arquivo zip com carimbo de data/hora

Criando um arquivo zip com carimbo de data/hora

Tenho tentado criar um script que compacta um diretório com um carimbo de data e hora e movê-lo para outro local no mesmo servidor, mas não consigo fazer com que TESTDATE seja exibido 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

Responder1

Você tem vários problemas aí.

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

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

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

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

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

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

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

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

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

  • Outro ponto é uma questão de estilo. Você deve sempre evitar usar nomes de variáveis ​​em MAIÚSCULAS porque as variáveis ​​ambientais são todas em letras maiúsculas e isso pode causar problemas se você usar o mesmo nome.

De qualquer forma,seEu entendo o que você está tentando fazer aqui, você poderia escrever o script assim (eu transformei dirsem um array, pois acho que era isso 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.zipe /volume1/NetBackup/Backup/Mar-05-14 foobar.zip. A propósito, eu também sugiro fortemente que você evite criar nomes de arquivos com espaços, você me agradecerá mais tarde.

informação relacionada