Crear un archivo zip con una marca de tiempo

Crear un archivo zip con una marca de tiempo

He estado intentando crear un script que comprime un directorio con una marca de tiempo y lo mueve a otra ubicación en el mismo servidor, pero parece que no puedo mostrar TESTDATE en el archivo zip, lo que da como resultado el nombre de archivo .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

Respuesta1

Tienes varios problemas allí.

  • Primero, desea asignar el resultado del comando date +%b-%d-%ya la TESTDATEvariable. Para hacerlo, es necesario utilizarsustitución de comando:

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

    Lo que su script está haciendo actualmente es asignar la cadena date +%b-%d-%y, TESTDATEno el resultado del comando. Puedes probar ejecutando esto:

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

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

  • En segundo lugar, estás utilizando la sustitución de comandos donde no deberías, lo que quieres es:

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

    Entonces, no quieres los paréntesis. Tampoco tengo idea de qué estás intentando hacer basenameallí. basenamees un programa predeterminado y no es necesario colocarlo en una variable para usarlo. El comando anterior establece el archivo zip en /volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basenameun nombre de archivo no válido. Si explica lo que está intentando hacer con el nombre base, es posible que pueda ayudarlo, pero tal como está, no tiene sentido.

  • Parece pensar que DIRSes una lista, pero no lo es, es solo un directorio único /volume1/NetBackup.

  • Otro punto es una cuestión de estilo. Siempre debe evitar el uso de nombres de variables en CAPITAL porque las variables ambientales están todas en mayúsculas y esto podría generar problemas si usa el mismo nombre.

De todos modos,siEntiendo lo que intentas hacer aquí, podrías escribir el script de esta manera (lo he convertido dirsen una matriz porque creo que eso es lo que querías):

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

El script de ejemplo anterior crearía /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zipy /volume1/NetBackup/Backup/Mar-05-14 foobar.zip. Por cierto, también te sugiero encarecidamente que evites crear nombres de archivos con espacios; me lo agradecerás más tarde.

información relacionada