Kopieren von Dateien per Shell

A

Akki

Grünschnabel
Hallo Liebe Forumnutzer,

vielleicht kann mir jemand helfen:

Aufgabe:

Ich möchte Bilder von unterschiedlichen IP Cams, die ihre Bilder via FTP
an den Server senden aus einem Ordner per Skript alle 50 sekunden auf
unterschiedliche Servereigene Ordner kopieren und aus dem sagen
wir mal Anlieferungsordner herauslöschen.

Die Bilddateien sind wie folgt aufgebaut: Gerätenummer_Name_Bildnummer.jpg
z.B. 005542254_Waldcam_781.jpg.

Zur Zeit gehe ich wie folgt vor

Die Dateinamen werden mit einer Zuordnungsregel per ls -1 in einer Variablen ausgelesen.
Ich nehme eine while do Schleife, die alle 40 Sekunden die Ursprungsbilder per cp
kopiert und nach dem kopieren via mv löscht.

Nun meine Probleme

1. Es darf nur eine Bilddatei im Odner sein sonst spinnt cp - ich glaube hier muss dann ein Array ran.

2. Werden beim kopieren, die Daten gerade von der Kamera hochgeladen
sind die Bilder 0 Byte oder nur zu dem Anteil an Byte kopiert, wie diese
gerade beim aufruf des Skiptes waren. - gibt es keine Möglichkeit zu überprüfen ob eine Datei vollständig ist

Vielleicht hat ja jemand eine Idee, ich wäre bestimmt glücklich darüber.

Mit freundlichen Grüßen

Akki
 
Du machst das doch ziemlich umständlich.
Das regelmäßige ausführen eines befehls läuft normal über einen cron job. Wenn du wissen willst, ob auf eine datei geschrieben wird schau dir lsof an. Wenn du dateien verschieben willst dann mach das gleich mit mv.
 
Die Dateinamen werden mit einer Zuordnungsregel per ls -1 in einer Variablen ausgelesen.

Mal vom wahrscheinlichen Vertipper (-1 statt -l) abgesehen, bin ich mir ziemlich sicher, daß man diesen Konstrukt auch nicht braucht.

Auslesen mittels ls ist zu > 99% unnötig und hat meist nur eine Funktion, es sorgt für Ärger.

Entweder verwendet man ein for mit entsprechender Wildcard oder man löst es über find (mit anschließendem -exec).
 
Das ist bestimmt kein Vertipper, da er so die Filenamen und nur die Filenamen ausliest ;)

Akzeptiert (nennt sich wohl Macht der Gewohnheit, wahrscheinlich waren es die vielen "fdisk -1" o.ä. aus diversen Forenbeiträgen, die einen entsprechenden "Reflex" ausgelöst haben).
Unnötig wird dieser ls-Konstrukt aber mit an Sicherheit grenzender Wahrscheinlichkeit trotzdem sein

Btw. zeig uns doch mal dein Script.

ACK.
 
Hallo Liebe Forumnutzer,

danke erst einmal für die vielen Antworten aber ich muss eines noch
hinzufügen. Ja es handelt sich bei ls mit dem Parameter -1 (minus eins),
um nur die Darstellung des Dateinamens zu erhalten.

Wie marcellus schrieb:Das regelmäßige ausführen eines befehls läuft normal über einen cron job
Ist mir ja bekannt aber ein Cron job läuft nur pro Minute, aber ich kann
marcellus beruhigen ich starte täglich das Script mit einem Cronjob.

Ich habe mal hier das irre Script eingefügt:

Code:
1. #!/bin/sh
2.
3. while true
4. do
5.   if test -f 00*.jpg
6.     then
7.       ls -t -1 /srv/www/vhosts/ftpdomain.com/webcam-12831/00*.jpg |
8.       while read filename;
9.       do
10.        cp "$filename" "/srv/www/vhosts/domain.de/httpdocs/media-cam/webcam-12831.jpg"
11.        sleep 5
12.        mv "$filename" /dev/null
13.        mv 00*.jpg /dev/null
14.        done
15.    fi
16.  sleep 40
17.  done

Ich habe das Script um einige Zeilen gekürzt um es übersichtlicher zu machen.
Warum verwende ich cp statt mv -> damit der Zeitstempel übergeben wird.

Das Script wird als root ausgeführt.

Mit freundlichen Grüßen

Akki
 
Mein Tipp:
Alles mit einer for-Schleife realisieren, in der du `ls -1` als Parameter $i an den cp-Befehl übergibst.
Code:
for <var> in <liste>; do <befehle>; done
 
Mein Tipp:
Alles mit einer for-Schleife realisieren, in der du `ls -1` als Parameter $i an den cp-Befehl übergibst.
Code:
for <var> in <liste>; do <befehle>; done

Löst sich da dann auch das Problem mit den leeren Dateien oder muss ich
unfertige mit einer lsof Regel ausschließen lassen.

Mit freundlichen Grüßen

Akki
 
Leere Dateien musst du zuvor noch prüfen z.B. mit
Code:
if [ $i -eq 0 ] then ...
 
Leere Dateien musst du zuvor noch prüfen z.B. mit
Code:
if [ $i -eq 0 ] then ...

Hallo reni,

ich glaube es jetzt hinbekommen zu haben. Ich werde mal das Script
jetzt erst einmal einige Tage laufen lassen.

Sollte ich dennoch Probleme habe melde ich mich hier noch einmal melden.

Vielen Dank.

Mit freundlichen Grüßen

Akki
 
*öhm*

Code:
12.        mv "$filename" /dev/null
13.        mv 00*.jpg /dev/null
Könntest Du uns den Sinn dieses Konstruktes erklären?

(Ich weiß ja nicht, wie es den anderen Lesern dieses Threads geht, aber IMHO würden 9 von 10 Kleingärtnern hier "rm" verwenden.)
 
Und 10 von 10 Kleingärtnern würden statt
Code:
cp a b; mv a /dev/null
nicht
Code:
cp a b; rm a
sondern
Code:
mv a b
verwenden, denke ich
 
ich wuerde nur "linken", maximal die uploads in eine changeroot packen und auch da linken.
 

Ähnliche Themen

Kopieren von Dateien und oder Verzechnissen

git bundle aktivieren

Thecus N5200pro Oxyl Medien Server installieren

mit find und exec Dateien aus verzeichnis kopieren

Natiulus und kopieren oder verschieben

Zurück
Oben