Backupscript erstellen

Hi,

ich möchte ein shell script schreiben und habe davon keine Ahnung.
Das Script soll bei Ausführung folgendes machen:

1.) Es soll in meinem Homedirectory einen Ordner erstellen, dessen Name
das aktuelle Datum sein soll.

2.) Es soll alle .F-Dateien mit dem Schriftzug „PBE“ irgendwo im Namen in einem anderen Ordner als dem Homedirectory suchen und in den Ordner kopieren, der in Schritt 1 erstellt wurde

Wie ihr erkennen könnt, handelt es sich um ein Archivierungs/Backupscript. Ich arbeite täglich mit diesen Dateien .F Dateien und möchte dafür tägliche Backups anfertigen.

Kann mir jemand sagen wie das geht?

Gruss,
Timo

ich möchte ein shell script schreiben und habe davon keine
Ahnung.

Die einfachste Art, ein Shellscript zu schreiben, ist, eine Textdatei anzulegen und dort genau die gleichen Befehle einzutippen, mit der du die Aufgabe auch manuell in der Shell lösen würdest.

1.) Es soll in meinem Homedirectory

cd /home/dein_directory

einen Ordner erstellen,

mkdir date '+%Y-%m-%d'

2.) Es soll alle .F-Dateien mit dem Schriftzug „PBE“ irgendwo
im Namen in einem anderen Ordner als dem Homedirectory suchen

find / -name *PBE*.F ! -regex /home/* -exec cp {} date '+%Y-%m-%d' ;

Der find-Befehl ist von einem bekloppten Autisten erfunden worden, da musst du mit der Syntax höllisch aufpassen. Am besten nicht abtippen, sondern per copy&paste kopieren. Und er funktioniert nicht auf jedem System identisch, es kann daher sein, dass dein System obigen Befehl anmeckert. Dann müssen wir ans Eingemachte…

Der find-Befehl, genauer sein Parameter -name, ist case sensitive. Wenn einer der Buchstaben aus *PBE*.F auch kleingeschrieben sein darf muss der Parameter -iname lauten.

Es ist sinnvoll, der Shell mitzuteilen, welche Shell für die Ausführung des Scripts zuständig ist. Dafür trägst du deren Pfad als erste (Shebang-) Zeile ins Script ein:

#! /bin/sh

Die Umgebung, in der das Script abläuft, kann sich substantiell von der Kommandozeile unterscheiden, in der du die Befehle testest. Daher sind alle Befehlsverweise vollqualifiziert anzugeben. Die qualifizierten Pfade können wiederum je System verschieden sein, möglicherweise musst du das folgende fertige Script (die Vorkommen von /bin/ bzw. /usr/bin/) also dahingehend anpassen:

#! /bin/sh

cd /home/dein\_directory
/bin/mkdir `/bin/date '+%Y-%m-%d'`
/usr/bin/find / -name \*PBE\*.F ! -regex /home/\* -exec cp {} `/bin/date '+%Y-%m-%d'` \;

Die Textdatei speichern, mit chmod +x ausführbar machen, mit Pfadangabe aufrufen (also ./dein_script.sh oder /ordner/dein_script.sh, nicht einfach nur dein_script.sh).

HTH

danke :smile:

J~

regex
Hallo Herrmann,
ich habe dein Skript gleich mal für mich angepasst, nur um mal mit -regex zu spielen (diese Option ist mir bis jetzt entgangen). Aus

/usr/bin/find / -name *PBE*.F ! -regex /home/* -exec cp {}

habe ich

find / -name '\*.pdf' ! -regex '/home/\*'

gemacht, um alle pdf-Dateien ausser im Home-Verzeichnis zu finden. Ich glaubte, das verstanden zu haben. ! -regex ‚/home/*‘ sorgt dafür, daß nicht im Home-Verzeichnis gesucht wird, soweit die Theorie…
Aber in der Praxis findet das Kommando trotzdem die pdf-Dateien auch im Home-Verzeichnis, wie ein Auszug aus

find / -name '\*.pdf' ! -regex '/home/\*' | grep /home

zeigt:

/home/tux/Dropbox/Documentation/2D/Alchemy.pdf
/home/tux/Dropbox/Documentation/2D/GPS\_Gimp Paint Studio 1\_2 manual.pdf
/home/tux/work/BOOK-KATALOG/buecher\_small.pdf
/home/tux/.themes/Timeless/metacity-1/gplv3.pdf


Eine Überprüfung mit wc zeigt, dass das find-Kommando so wider Erwarten tatsächlich trotzdem alle pdf-Dateien im Home-Verzeichnis findet:

find / -name '\*.pdf' ! -regex '/home/\*' | grep /home | wc

->

40 79 2397

und

find /home -name \*.pdf | wc

->

40 79 2397

Was läuft da schief, bzw. was mache ich falsch?
Mein System: Linux 2.6.31-22-generic-pae, Ubuntu 10.04, GNU bash Version 4.0.33(1)-release (i486-pc-linux-gnu)

Viele Grüsse
Jan

Hallo,

! -regex
‚/home/*‘
sorgt dafür, daß nicht im Home-Verzeichnis
gesucht wird, soweit die Theorie…

Probiere ‚/home/.*‘

In einer Regex steht * fuer "0 oder beliebig viele Widerholungen des vorherigen Zeichens’, /home/* waere also /home, /home/, /home// /home/// etc.

Gruesse,
Moritz

Aber in der Praxis findet das Kommando trotzdem die
pdf-Dateien auch im Home-Verzeichnis,

Moritz hat die Antwort ja schon geliefert. Normalerweise teste ich Kommandos, bevor ich sie hier veröffentliche. In meinen Tests hatte ich aber ein etwas anderes Ausschlussmuster getestet und bei der späteren Transformation den Punkt vergessen.

Dabei wollte ich eigentlich sogar in einem Nebensatz noch mal darauf eingehen, dass die Wildcards im Argument -name anders aufgelöst werden, als im -regex-Argument. Eine der netten kleinen Fallen, die die Unix-Kommandozeile für alle Fans von Kraut und Rüben anstelle halbwegs intuitiv nachvollziehbarer Schnittstellen bereithält.

Gruß

Hallo hermann,

Danke für die Hilfe, ich werde das Skript die Tage mal testen. Du hast ein Sternchen mehr :wink:

Gruß,
Timo

Hallo Moritz,

Probiere ‚/home/.*‘

Vielen Dank, genau das war es. Ein kleiner Punkt für die Regex, ein grosser Unterschied für das Ergebnis :wink:

Viele Grüsse
Jan