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
àTESTDATE
variá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-%y
aTESTDATE
, 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
basename
isso.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/basename
o 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 dirs
em 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.zip
e /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.