lokaler copy job via cron job

Status
Für weitere Antworten geschlossen.

geordi

Benutzer
Mitglied seit
09. Sep 2011
Beiträge
45
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen

Bin nicht so der Unix/Linux Mensch, von daher bitte ich um Nachsicht und Hilfe was das angeht ...

Auf der Syno gibt es ein Verzeichnis in das virtuelle Maschinen gesichert werden. Nun möchte ich gerne per cron job bestimmte Dateien aus dem Verzeichnis in einem gewissen Zeitabstand immer mal in ein anderes Verzeichnis kopieren. Der Job sollte in das Verzeichnis schauen, die dort befindlichen VBK-Dateien (ist die Dateiendung) auslesen und die aktuellste davon soll kopiert werden in ein anderes Verzeichnis welches auf derselben Syno liegt.
Unter Windows könnte ich das relativ schnell scripten, ist halt leider kein Windows was auf der Syno läuft *lol* ... und lokal auf der Syno sollte das laufen damit ich keinen Netzwerktraffic generiere.

Einen Cron Job einrichten ist kein Thema, das habe ich schon hinbekommen ... auch wie ich den zeitlich steuere ist kein Thema ... brauch halt nur etwas Nachhilfe zu dem eigentlich Shell Script was ich da bauen muss ... mir würde es auch schon ausreichen wenn mir einer von Euch die benötigten Befehle oder so nennt, dann friemel ich mich da selber rein.

Danke schon mal vorab und Gruss,
Michael
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
guck mal in unser Wiki ... da ist schon ein wenig zur Shell enthalten. ich hab mal vor einiger Zeit hier im Forum einen 12-teiligen Shell-Workshot geschrieben (suchen), der dich eventuell auch weiter bringt. Ansonsten soltest mehr Vorgaben machen, damit man sich auch etwas besser vorstellen kann, was du so haben willst.

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Du musst genau genommen noch nicht mal ein Shellscript schreiben ;-) Sagen wir du hast drei Dateien (img1, img2 und img3) im Verzeichnis /volume1/vms und willst sie nach /volume1/vmbackup kopieren. Dann könntest du so was in der Art probieren:
Code:
3 0 * * * root mkdir /volume1/vmbackup/`date '+%d-%m-%y'` ; cp -p /volume1/vms/{img1,img2,img3} /volume1/vmbackup/`date '+%d-%m-%y'`/
um 3 Minuten nach Mitternacht läuft dieser Job an und erstellt erstmal im Backupverzeichnis ein neues Unterverzeichnis mit dem aktuellen Datum im Namen. Dann kopiert cp die drei Dateien dort hin. -p heisst, dass cp die Rechte/Eigentümer und Gruppe der Dateien beibehält.

Was du beim obigen Schnippel noch anpassen solltest ist dass du statt der Kommandos die kompletten Pfade zu den Kommandos angibst. Hintergrund: cron hat eine eigene PATH-Umgebung d.h. du kannst obige Kommandos fehlerfrei auf der Konsole ausführen, cron dürfte jedoch auf die Schnauze fallen. Drum in cronjob immer komplette Pfadangaben zum Kommando angeben. Den vollständigen Pfad zum Kommando bekommst du mit dem Kommando which raus
Code:
which KOMMANDO
das machst du auf der Konsole für jedes Kommando im cron und passt die Pfade im cron entsprechend an
 

geordi

Benutzer
Mitglied seit
09. Sep 2011
Beiträge
45
Punkte für Reaktionen
0
Punkte
0
Danke, das isses schon fast ... aber halt nur fast :)
Dann mal genauer, werde mir aber auf jeden Fall auch noch den Workshop geben was Shell Script angeht ... brauch ich immer mehr, auch auf VMware Ebene...

In Verzeichnis1 liegen unterschiedliche Dateitypen mit unterschiedlichen Endungen (VBK, VIB, VBM ... kopieren will ich genaugenommen nur eine ganz bestimmte Datei, die hat aber einen Namen der sich jede Woche ändert, somit kann ich das nicht fest scripten sondern muss die Datei erst finden ... und dazu muss ich einfach nur die Dateien mit der Dateiendung VBK aus dem Verzeichnis1 auslesen und die Datei die das neueste Datum hat ist die Datei die ich kopieren will ... die anderen Dateien mit der Dateiendung VBK interessieren mich nicht und sollen einfach nicht beachtet werden bei dem copy Job.

Oder anders gesagt ... guck Dir alle Dateien mit der Endung VBK in dem Verzeichnis1 an und die neueste/jüngste/aktuellste von den VBK Dateien kopierst Du bitte mal an einen anderen Ort.

----edit----

Okay Ihr Unix/Linux Spezis, schaut Euch das mal an :)

VAR=$(find -iname "*.VBK" | xargs ls -tr | tail -1 | sed 's!./!!g')

Die Zeile hat mich jetzt ca. 90 Minuten gekostet, scheint aber zu funzen ... somit hab ich den Dateinamen der VBK Datei die ich haben will in VAR stehen und kann das nutzen für einen copy job ... seht Ihr das auch so? Oder hab ich da en Fehler drin den ich momentan nicht sehe weil ich einfach zu wenig Ahnung davon habe?
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Code:
ls -t /verzeichnis1/*.VBK | head -n 1
weniger Zeichen ;-)
ls -t sortiert absteigend nach Modification-Date. mit *.vbk sollten keine Verzeichnisse erwischt werden und head -n 1 gibt die erste Zeile der gesamten Liste zurück. Also die jüngste VBK Datei
 

geordi

Benutzer
Mitglied seit
09. Sep 2011
Beiträge
45
Punkte für Reaktionen
0
Punkte
0
angeber, was sind schon ein paar bytes bei dem code ;)

Vielen vielen Dank, werde das morgen mal in Ruhe austesten
 

geordi

Benutzer
Mitglied seit
09. Sep 2011
Beiträge
45
Punkte für Reaktionen
0
Punkte
0
Klappt soweit ... nun geht es weiter :)

Derzeit habe ich also den Befehl so dass er mir aus einem fest vorgegebenem Verzeichnis die gewünschte Datei ausliest, den kompletten Pfad + Dateinamen in eine Variable speichert und das dann in ein bestimmtes Zielverzeichnis kopiert ... sieht also so aus:
Rich (BBCode):
datei=$(/bin/ls -t /volume1/Ordnerfest/Ordnervariabel/*.vbk | /usr/bin/head -n 1); cp $datei /volume1/OrdnerZiel/

Der nächste Schritt ist es nun dass ich die Pfadangabe zu der Quelle variabel gestalten möchte da es innerhalb des Ordners "Ordnerfest" mehrere Unterordner gibt die der Reihe nach auf die gewünschte VBK untersucht und danach kopiert werden sollten
Wenn ich das richtig verstanden habe kann ich das mit einer for Schleife machen ... for i in `ls /volume1/Ordnerfest` do .... nur wie übergebe ich dann die gefundenen Ordnernamen in die Zeile mit dem Befehl für das Suchen der VBK Datei?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
1. du kannst afaik direkt auf die Variable zugreifen ohne den Umweg es zuerst in der Var zu speichern. Also müsste folgendes klappen
Code:
cp -p $(/bin/ls -t /volume1/Ordnerfest/Ordnervariabel/*.vbk | /usr/bin/head -n 1) /volume1/OrdnerZiel/
2. willst du denn von allen variablen Ordnern jeweils die aktuellste vbk haben oder nur die aktuellste aus mehreren Verzeichnissen? Ich vermute mal du willst pro Vezeichnis die aktuellste haben, daher würde ich so was probieren
Code:
for i in ordner1 ordner2 ordner3 ordner4 ; do
 cp -p $(/bin/ls -t /volume1/Ordnerfest/$i/*.vbk | /usr/bin/head -n 1) /volume1/OrdnerZiel/
done
 

geordi

Benutzer
Mitglied seit
09. Sep 2011
Beiträge
45
Punkte für Reaktionen
0
Punkte
0
Den 2. Teil habe ich auch schon so probiert, stolper da aber noch ....

Ich verstehe das ja so dass ich schreiben muss:

Rich (BBCode):
for i in /volume1/Ordnerfest/ ; do
 cp -p $(/bin/ls -t /volume1/Ordnerfest/$i/*.vbk | /usr/bin/head -n 1) /volume1/OrdnerZiel/
done

Denn er soll das ja für jedes Verzeichnis machen was er in Ornderfest findet ... aber er kann dann beim cp nicht mit der Variable $i arbeiten, das bricht mir dann immer ab mit no such file or directory.
Oder verstehe ich das falsch mit Ordner1 Ordner2... was Du geschrieben hast?

Der 1. Teil von Dir klappt super ... vielen vielen vielen vielen Dank dafür....


Hab mittlerweile auch ne vorherige Abfrage drin nach dem aktuellen Monat um da auch drauf reagieren zu können ... der letzte Step wäre dann wenn machbar dass ich nach Jobende ne Mail kriege was er für Dateien kopiert hat und wohin
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
ne so geht das nicht. for i in ... erwartet mehrere Argumente. Mit nur einem Argument kannst du es gleich lassen mir der for-Schleife :) Dann brauchst du keine Schleife. Sind denn die Verzeichnisse immer direkte Unterverzeichnisse von Ordnerfest? Wenn ja dann würde ich im for mit find arbeiten
Code:
for in in $(find -maxdepth 1 -type d /volume1/Ordnerfest) ; do
 cp -p $(/bin/ls -t $i/*.vbk | /usr/bin/head -n1) /volume1/OrdnerZiel/$(basename $i)_$(date '+%d_%m_%y')
done
basename wird nötig weil find den gesamten Pfad zurückliefern wird und du nur den Dateinamen brauchst. Zusätzlich noch mittels date im Namen das aktuelle Datum. Setzt aber voraus, dass die vbk Dateien keinesfalls gleich heissen, sonst wird überschrieben. Beim find legst du via -type d fest, dass nur Verzeichnisse gesucht werden sollten und mit -maxdepth verhinderst du dass der find rekursiv von Ordnerfest nach unten geht. Der find findet also nur direkte Unterverzeichnisse von Ordnerfest
 

geordi

Benutzer
Mitglied seit
09. Sep 2011
Beiträge
45
Punkte für Reaktionen
0
Punkte
0
Mir fehlen die Worte .. ich denke mal das sagt alles :) ... vielen vielen Dank für die große Hilfe

smiley_emoticons_kinggrin_anbeten.gif


Aber:
Das klappt leider nicht :-(
den find befehl musste ich umstricken auf
Rich (BBCode):
find  /volume1/Ordnerfest -maxdepth 1 -type d

Ansonsten hat er immer abgebrochen.

Und trotz Anpassung schlägt es immer noch fehl da find als erstes den /volume1/Ordnerfest auflistet und da keine VBK Datei vorhanden ist

---edit---

Hab einfach noch Schleife eingebaut die schaut ob vbk-Dateien existieren, jetzt läufts....

Rich (BBCode):
for i in $(find /volume1/Ordnerfest -maxdepth 1 -type d) ; do
count=`/bin/ls -t $i/*.vbk 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
cp -p $(/bin/ls -t $i/*.vbk | /usr/bin/head -n1) /volume1/OrdnerZiel/
fi
done

basename brauch ich nicht da das Ziel nur ein Ordner ist und nicht unterschiedlich ... und da die Dateien immer unterschiedlich sind vom Namen her passt es nun und der erste Testlauf ist gerade am rennen
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich würde alles in einer Zeile machen ;-)
Code:
[LEFT][COLOR=#333333]for i in $(find /volume1/Ordnerfest/ -maxdepth 1 -type d) ; do[/COLOR]
 ls $i/*.vbk > /dev/null 2>&1 ; [ $? -eq 0 ] && cp -p $(/bin/ls -t $i/*.vbk | /usr/bin/head -n1) /volume1/OrdnerZiel/[/LEFT]

fi
ls prüft in $i auf vbk Dateien. Wenn eine gefunden wird dann gibt das Kommando 0 zurück. Auf den Rückgabewert kannst du via $? zugreifen und das ist immer der Rückgabewert vom letzten Kommando vorher. Wenn also eine mindestens eine Datei gefunden wird dann wird der cp gemacht. Dafür sorgt die Verknüpfung mittels && d.h. nur wenn $? gleich 0 ist (also die Bedingung erfüllt wird) wird das verknüpfte Kommando auch ausgeführt
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat