Création d'un fichier zip avec un horodatage

3

J'ai essayé de créer un script qui compresse un répertoire avec un horodatage et le déplace vers un autre emplacement sur le même serveur, mais je n'arrive pas à obtenir l'affichage de TESTDATE sur le fichier zip, ce qui donne le nom de fichier .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
Reqx
la source

Réponses:

5

Vous avez divers problèmes là-bas.

  • Tout d'abord, vous voulez affecter le résultat de la commande date +%b-%d-%yà la TESTDATEvariable. Pour ce faire, vous devez utiliser la substitution de commande :

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

    Ce que votre script est en train de faire, c'est d'affecter la chaîne date +%b-%d-%yà TESTDATE, pas le résultat de la commande. Vous pouvez tester en exécutant ceci:

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

    qui va imprimer date +%b-%d-%y.

  • Deuxièmement, vous utilisez la substitution de commande là où vous ne devriez pas, ce que vous voulez, c'est:

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

    Donc, vous ne voulez pas les parenthèses. Je n'ai également aucune idée de ce que vous essayez de faire avec basename. basenameest un programme par défaut et vous n'avez pas besoin de le placer dans une variable pour l'utiliser. La commande ci-dessus définit /volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basenameun fichier zip dont le nom de fichier n'est pas valide. Si vous expliquez ce que vous essayez de faire avec nom de base, je pourrais peut-être vous aider, mais cela n'a aucun sens.

  • Vous semblez penser que DIRSc'est une liste, ce n'est pas un répertoire unique /volume1/NetBackup.

  • Un autre point est une question de style. Vous devez toujours éviter d'utiliser des noms de variables CAPITAL, car les variables d'environnement sont en majuscules, ce qui peut poser problème si vous utilisez le même nom.

Quoi qu'il en soit, si je comprends ce que vous essayez de faire ici, vous pouvez écrire le script de la manière suivante (j'ai créé dirsun tableau puisque je pense que c'est ce que vous vouliez):

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

L'exemple de script ci-dessus créerait /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zipet /volume1/NetBackup/Backup/Mar-05-14 foobar.zip. En passant, je vous suggère également fortement d'éviter de créer des noms de fichiers avec des espaces, vous me remercierez plus tard.

terdon
la source