Erstellen einer ZIP-Datei mit Zeitstempel

Erstellen einer ZIP-Datei mit Zeitstempel

Ich habe versucht, ein Skript zu erstellen, das ein Verzeichnis mit einem Zeitstempel komprimiert und es an einen anderen Ort auf demselben Server verschiebt, aber ich schaffe es nicht, TESTDATE in der ZIP-Datei anzuzeigen, was zu einem Dateinamen „.zip“ führt.

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

Antwort1

Da hast Du verschiedene Probleme.

  • Zuerst möchten Sie das Ergebnis des Befehls date +%b-%d-%yder TESTDATEVariablen zuweisen. Dazu müssen Sie verwendenBefehlsersetzung:

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

    Was Ihr Skript derzeit tut, ist, die Zeichenfolge zuzuweisen date +%b-%d-%y, TESTDATEnicht das Ergebnis des Befehls. Sie können dies testen, indem Sie Folgendes ausführen:

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

    das druckt date +%b-%d-%y.

  • Zweitens verwenden Sie Befehlsersetzungen an Stellen, wo Sie das nicht sollten. Was Sie wollen, ist:

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

    Sie wollen also keine Klammern. Ich habe auch keine Ahnung, was Sie damit vorhaben basename. basenameist ein Standardprogramm und Sie müssen es nicht in eine Variable einfügen, um es zu verwenden. Der obige Befehl setzt zipfile auf , /volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basenamewas kein gültiger Dateiname ist. Wenn Sie erklären, was Sie mit basename vorhaben, kann ich Ihnen vielleicht helfen, aber so ergibt es keinen Sinn.

  • Sie scheinen zu glauben, dass es DIRSsich dabei um eine Liste handelt, aber das ist nicht der Fall, sondern nur ein einzelnes Verzeichnis /volume1/NetBackup.

  • Ein weiterer Punkt ist eine Frage des Stils. Sie sollten die Verwendung von Variablennamen in GROSSBUCHSTABEN vermeiden, da Umgebungsvariablen immer in Großbuchstaben geschrieben sind und dies zu Problemen führen kann, wenn Sie denselben Namen verwenden.

Ohnehin,WennIch verstehe, was Sie hier versuchen. Sie könnten das Skript folgendermaßen schreiben (ich habe es dirsin ein Array umgewandelt, da ich glaube, dass es das ist, was Sie wollten):

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

Das obige Beispielskript würde /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zipund erstellen /volume1/NetBackup/Backup/Mar-05-14 foobar.zip. Übrigens würde ich Ihnen auch dringend empfehlen, die Erstellung von Dateinamen mit Leerzeichen zu vermeiden. Sie werden mir später danken.

verwandte Informationen