bash Scripting, Dateien in Datumsordner

kugelschubs

Registered User
Hallo,

ich möchte gerne ein bash Script erstellen das

  1. ein Verzeichnis mit datum und Uhrzeit erstellt
  2. Dateien von von irgendwo sonst dort hinein kopiert

Wie ich das Verzeichnis erstelle ist mir klar:
Code:
#!/bin/bash

datum=`date '+%d-%m'-%y__%H-%M-Uhr`

mkdir ./$datum

Jetzt habe ich auf dem Server den Ordner XY und möchte alle Daten darin in den neuen Ordner kopieren / verschieben mit cp oder mv.
Wie muss das dann aussehen?
Es soll auch nicht bei einem Datumsordner bleiben, es kommen dann immer welche hinzu...
Wie kann ich die Daten dann in den richtigen Ordner verschieben?

Soweit wäre ich und komme nicht weiter:
Code:
#!/bin/bash

UEBERGEORDNET="/home/www/blablabla/ordnerAA/
STARTORDNER="/home/www/blablabla/ordnerXY/"
datum=`date '+%d-%m'-%y__%H-%M-Uhr`

echo "### Erstelle Datumsordner"
cd $UEBERGEORDNET
mkdir ./$datum
echo "### Befehl ausgeführt"
echo "###"
echo "### Kopiere von Startordner in Datumsordner"
cp -uv $STARTORDNER*.jpg /HIER-KOMME-ICH-NICHT-WEITER/
echo "### Befehl ausgeführt"
echo "###"
echo "### Lösche Daten aus Startordner"
rm -fv $STARTORDNER*.jpg
echo "### Befehl ausgeführt"

exit 0

Gruss
Peter
 
Last edited by a moderator:
würde es evtl. so gehen?

Code:
#!/bin/bash

UEBERGEORDNET="/home/www/blablabla/ordnerAA/"
STARTORDNER="/home/www/blablabla/ordnerXY/"
datum=`date '+%d-%m'-%y__%H-%M-Uhr`

echo "### Erstelle Datumsordner"
cd $UEBERGEORDNET
mkdir ./$datum
echo "### Befehl ausgeführt"
echo "###"
if test -d $datum
then
    echo "### Kopiere von Startordner in Datumsordner"
    cp -uv $STARTORDNER*.jpg $datum
    echo "### Befehl ausgeführt"
else
    echo "### Ordner nicht vorhanden"
fi
echo "###"
echo "### Lösche Daten aus Startordner"
rm -fv $STARTORDNER*.jpg
echo "### Befehl ausgeführt"

exit 0

???
 
Last edited by a moderator:
cp -uv $STARTORDNER*.jpg /HIER-KOMME-ICH-NICHT-WEITER/

Ich versteh nicht ganz was du willst, Quelle -> Ziel
/HIER-KOMME-ICH-NICHT-WEITER/ muss ein absolutes Verzeichniss sein.
Wenn du / davorpackst meint er auch / (indem etc, home, etc. liegen)

Ansonsten poste doch mal dein ganzes Script, auch Mit richtigen Verznamen.
Wer soll dir was weggucken...
 
So stelle ich es mir vor (mit richtigen Verzeichnisnamen)

Code:
#!/bin/bash

UEBERGEORDNET="/home/www/web15/vfp/klein/"
STARTORDNER="/home/www/web15/vfp/startordner/"
datum=`date '+%d-%m'-%y__%H-%M-Uhr`

echo "### Erstelle Datumsordner"
cd $UEBERGEORDNET
mkdir ./$datum
echo "### Befehl ausgeführt"
echo "###"
if test -d $datum
then
    echo "### Kopiere von Startordner in Datumsordner"
    cp -uv $STARTORDNER*.jpg $datum
    echo "### Befehl ausgeführt"
else
    echo "### Ordner nicht vorhanden"
fi
echo "###"
echo "### Lösche Daten aus Startordner"
rm -fv $STARTORDNER*.jpg
echo "### Befehl ausgeführt"

exit 0

geht das so ???
 
Last edited by a moderator:
da sind ein paar Schnitzer drin, die ich gerade sehe.
Mach mal bash -x scriptname

dann siehst deinen Output, was er macht.
 
Das ist die Ausgabe:
Code:
root:/VFP # bash -x test.sh
+ UEBERGEORDNET=/home/www/web15/vfp/klein/
+ STARTORDNER=/home/www/web15/vfp/startordner/
++ date +%d-%m-%y__%H-%M-Uhr
+ datum=28-01-09__17-23-Uhr
+ echo '### Erstelle Datumsordner'
### Erstelle Datumsordner
+ cd /home/www/web15/vfp/klein/
test.sh: line 8: cd: /home/www/web15/vfp/klein/: No such file or directory
+ mkdir ./28-01-09__17-23-Uhr
+ echo '### Befehl ausgeführt'
### Befehl ausgeführt
+ echo '###'
###
+ test -d 28-01-09__17-23-Uhr
+ echo '### Kopiere von Startordner in Datumsordner'
### Kopiere von Startordner in Datumsordner
+ cp -uv '/home/www/web15/vfp/startordner/*.jpg' 28-01-09__17-23-Uhr
cp: cannot stat `/home/www/web15/vfp/startordner/*.jpg': No such file or directory
+ echo '### Befehl ausgeführt'
### Befehl ausgeführt
+ echo '###'
###
+ echo '### Lösche Daten aus Startordner'
### Lösche Daten aus Startordner
+ rm -fv '/home/www/web15/vfp/startordner/*.jpg'
+ echo '### Befehl ausgeführt'
### Befehl ausgeführt
+ exit 0
 
Ja wozu brauchst mich Jetzt noch.
No such file or directory

Fix das und dann gehts.
Das mit dem * funktioniert so nicht.
Schau dir diese Zeilen genauer an.
 
Hi,

ja - habs hinbekommen, danke nochmal.
Ich poste mal einen Teil meines Gesamtscriptes:

Code:
#!/bin/bash
# CAPics 1.0

ALIAS="Peter"
GROSS="/home/www/web15/html/vfp/gross/"
KLEIN="/home/www/web15/html/vfp/klein/"
GRKURZ="web15/html/vfp/gross"
KLKURZ="web15/html/vfp/klein"
STARTORDNER="/home/www/web15/html/vfp/startordner/"
ZWISCHENSPEICHER="/home/www/web15/html/vfp/zwischenspeicher/"
BACKUPORDNER="/platte2/backup/web15/originalfotos/"
datum=`date '+%d-%m'-%y__%H-Uhr`


echo "BENUTZER: $LOGNAME"
echo "BENUTZERNAME: $ALIAS"
echo ""
echo ""
echo ""
echo "#"
echo "##"
echo "###"
echo "############################################################################"
echo "###"
echo "### Schritt 1)" 
echo "###"
echo "### Bitte warten..."
echo "### Wandle in .jpg Format um."
echo "###"
echo "############################################################################"
echo "###"
echo "##"
echo "#"
echo ""
mogrify -format jpg $STARTORDNER*.JPG 
echo ""
echo "#"
echo "##"
echo "###"
echo "############################################################################"
echo "###"
echo "### Befehl erfolgreich ausgeführt!"
echo "###" 
echo "############################################################################"
echo "###"
echo "##"
echo "#"
echo ""
echo "#"
echo "##"
echo "###"
echo "############################################################################"
echo "###"
echo "### Schritt 2)" 
echo "###"
echo "### Bitte warten..."
echo "### Kopiere Fotos in entsprechende Ordner"
echo "###"
echo "############################################################################"
echo "###"
echo "### Status: Kopiere von Startordner in Zwischenspeicher"
echo "###"
cp -uv $STARTORDNER*.jpg $ZWISCHENSPEICHER 
echo "###"
echo "### Status: Kopiere von Startordner in Ordner für Vorschaubilder"
echo "###" 
if test -d $KLEIN$datum
then
    echo "### Datumsordner bereits vorhanden - kopiere Fotos"
    cp -uv $STARTORDNER*.jpg $KLEIN$datum
    mogrify -resize 100x133 -quality 100 $KLEIN$datum/*.jpg
else
    echo "### Erstelle Datumsordner und kopiere dann Fotos"
    mkdir $KLEIN$datum 
    cp -uv $STARTORDNER*.jpg $KLEIN$datum
    mogrify -resize 100x133 -quality 100 $KLEIN$datum/*.jpg
fi

echo "###"
echo "### Status: Kopiere von Startordner in Backupordner auf Festplatte 2"
echo "###"
cp -uv $STARTORDNER*.jpg $BACKUPORDNER 
echo "###"
echo "############################################################################"
echo "###"
echo "##"
echo "#"
echo ""
 
Mal so als Tipp: Du solltest dir den Unix-Stil an Ausgabe angewöhnen. Also das Prinzip "No news are good news.".

Du weißt ja, was dein Script macht - also interessiert dich höchstens, wenn was nicht geklappt hat.
Und besser lesen/ändern lässt sich so ein Script ohne den ganzen echo-Bloat auch besser.

Und ultimativ geht es auch um Funktion. Wenn du das per Cron startest, bekommst du immer eine Mail mit dem Output. Und damit das nicht mehr passiert musst du dann sowas machen:
Code:
/path/to/script >/dev/null
Dann verpasst du aber u.U. wenn das mal schief gelaufen ist, weil es dann keine Mail gibt.

Es ist deshalb üblich nur dann etwas auszugeben, wenn die Aufmerksamkeit des Users gefordert ist. In allen anderen Fällen funktioniert es einfach stillschweigend.
 
...es sei denn du möchtest eine Ausgabe bei jedem Crondurchlauf haben.

So ist es zum Beispiel bei meinem Backup Script und bei meinem Traffic-Berechnen-Script :)
Dabei möchte ich jeden Tag eine Mail darüber erhalten, dass meine Backups gesichert worden sind und wieviel Traffic ich verbraucht hab :)

Aber sonst geb ich elias Recht: Beim Debuggen ist es sinnvoll eine detailerte Ausgabe zu erhalten, aber bei Crons ist das i.d.R. nicht erwünscht.
 
Und damit das nicht mehr passiert musst du dann sowas machen:
Code:
/path/to/script >/dev/null
Dann verpasst du aber u.U. wenn das mal schief gelaufen ist, weil es dann keine Mail gibt.

'>' leitet die stdout Ausgabe in eine Datei um
stderr wird dabei aber nicht umgeleitet.
Wenn etwas schiefgeht, bekommst du es also trotzdem mit.
Um stdout und stderr umzuleiten benutzt man '&>'
 
'>' leitet die stdout Ausgabe in eine Datei um
Danke, ich weiß das. Ich wollte das Beispiel nicht so extrem machen wie "2>&1 >/dev/null". Aber ich denke doch, es trifft den Kern des Pudels.

Backup-Scripts lasse ich übrigens ihren Erfolg per send-nsca auf Nagios-Checks committen. Dann bekomme ich auch nur im Fehlerfall (auch, wenn eine Erfolgsmeldung ausgeblieben ist) Mails.

Es gibt nichts schlimmeres als Nerv im Erfolgsfall. Ich habe schon oft genug erlebt, wie wichtige Fehler nicht bemerkt wurden, weil die wegen des üblichen Nervs nicht mehr wahrgenommen wurden. Es hat einfach irgendwann keiner mehr die Meldungen beachtet.
 
Ich habe Dir nicht unterstellt, es nicht zu wissen.
Niemand stellt Deinen Wissensstand hier in Frage.
Mir ging es schlicht darum eine offensichtlich falsche Aussage in diesem Thread klarzustellen.
Schließlich gibt es Leute die darauf vertrauen was hier steht.

Zum 'Nerv': Ich bezeichne das gern als schlechte 'Signal to Noise Ratio' :)
 
Übrigens sehr lesenswert in dem Zusammenhang: Writing Robust Bash Shell Scripts

Besonders die Sache mit "set -o pipefail" ist interessant, wenn es darum geht, dass Fehler nicht größeren Pipe-Orgien untergehen.

Das hier ist gilt als Erfolg:
Code:
#!/bin/bash

if ( false | true ); then
  echo "Erfolg"
else
  echo "Fehler"
fi

Während das hier korrekt als Fehler zählt:
Code:
#!/bin/bash
set -o pipefail

if ( false | true ); then
  echo "Erfolg"
else
  echo "Fehler"
fi
 
Back
Top