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-%y
derTESTDATE
Variablen zuweisen. Dazu müssen Sie verwendenBefehlsersetzung:TESTDATE=$(date +%b-%d-%y)
Was Ihr Skript derzeit tut, ist, die Zeichenfolge zuzuweisen
date +%b-%d-%y
,TESTDATE
nicht 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
.basename
ist 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/basename
was 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
DIRS
sich 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 dirs
in 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.zip
und 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.