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-%y
a laTESTDATE
variable. 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
,TESTDATE
no 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
basename
allí.basename
es 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/basename
un 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
DIRS
es 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 dirs
en 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.zip
y /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.