Von Streamingserver angelegte Dateien umbenennen + in Verzeichnisse einordnen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Sisko78, 24.04.2007.

  1. #1 Sisko78, 24.04.2007
    Sisko78

    Sisko78 Jungspund

    Dabei seit:
    24.04.2007
    Beiträge:
    15
    Zustimmungen:
    0
    Hallo,

    bin schon ne Weile daran, eine gescheite Methode zu finden, die Audiodateien eines Streamingservers automatisch in Verzeichnisse abzulegen und zwar derart:

    - Verzeichnissname soll Datum sein, also etwa so 24-04-07
    - Die Streams werden stündlich erstellt und sollen in das passende Verzeichniss kopiert und so umbenannt werden, dass Anfangs- und Endzeit im Dateiname stehen. Der Server legt stündlich audiox.rm an, wobei x hochgezäählt wird und erst wieder bei neustart des Servers von vorne loszählt
    - Verzeichnisse sollen, wenn älter als 30 Tagen, mitsamt Inhalt gelöscht werden (aber da habe ich vorläufig mal ein extra skript gemacht, dass per cron täglich ausgeführt wird, allerdings werdne nur die Dateien gelöscht, da mache ich mich dann später noch mal dran)


    Mein letzter Ansatz:

    Code:
    #!/bin/bash
    
    PATH=/bin:/usr/bin:/sbin:/usr/sbin
    DIR=
    DESTINATION=
    
    cd $DIR
    for i in $(ls -l --time-style=long-iso *.rm|tr -s " "|cut -d " " -f8);do
    filename=$i
    # access time
    # atime=`stat --printf=%x $filename | cut -d " " -f2 | cut -d "." -f1 | sed 'y/:/-/'`
    
    #declare -i atimeHour=`echo $atime|cut -d "-" -f1`;
    #endtimeHour=$((atimeHour +1));
    mtime=`stat --printf=%y $filename | cut -d " " -f2 | cut -d "." -f1 | sed 'y/:/-/'`
    #mhour=`echo $mtime|cut -d "-" -f1`
    fdate=`stat --printf=%x $filename | cut -d " " -f1`
    
    #if [ "$mhour" -eq "0" ];then fdate=echo $fdate |
    cuttedFilename=`echo $i|cut -d "." -f1`
    ([ -d $DESTINATION/$fdate ] && echo 'directory exists' ) || mkdir $DESTINATION/$fdate && echo 'added directory'$DESTINATION/$fdate
    mv $filename $DESTINATION/$fdate/$cuttedFilename-$mtime.rm
    done
    
    Mit den auskommentierten Sachen habe ich etwas rumgespielt, aber bin nicht so richtig zu Besserung gekommen.

    Zum einen habe ich ein Problem, die Anfangszeit korrekt zu bestimmen, zum Anderen soll 23:01-0:01 noch nicht ins Verzeichnis für den neuen Tag (und mit access time habe ich irgendwie schwierigkeiten wegen weiterer Skripte, die gelegentlich laufen)

    Wäre toll, wenn mir jemand helfen könnte.

    Gruß
    Sisko78
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 24.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Bitte zunächst einmal das beachten, sonst geht das Rätseln wieder los.

    Falls du GNU find hast (und schon geht das Spekulieren los), sieh dir mal die Optionen für printf an.
    Dort kannst du dir gleich alles im geeigneten Format ausgeben lassen.
    Warum nutzt du nicht einfach die Ctime?

    Um z.B. die Dateiendung .rm wegzuschneiden:
    Code:
    a="12345.rm"
    New=${a/\.rm/};
    echo $New
    

    Dann (für GNU find) sieh dir mal folgenden Schnellschuß-Snippel an, der könnte dir eventuell ein paar Tipps geben: (ungetestet)
    Code:
    find ./ -maxdepth 1 -type f -printf "%f %CY-%Cm-%Cd %CH-%CM-%CS\n"|
    while read fname CDATE TIME;
    do 
    echo Dateiname: $fname;
    echo "Datum: $CDATE";
    echo Zeit: $TIME;
    newname=${fname/\.rm};
    echo $newname
    done
    Ach ja, ganze Verzeichnisse mit Inhalt werden mit
    Code:
    rm -r
    gelöscht.

    Gruß Wolfgang
     
  4. #3 Sisko78, 24.04.2007
    Zuletzt bearbeitet: 24.04.2007
    Sisko78

    Sisko78 Jungspund

    Dabei seit:
    24.04.2007
    Beiträge:
    15
    Zustimmungen:
    0
    Wow, vielen Dank, wieder was gelernt.

    Es handelt sich um gnu find, meine Versuche fanden unter (K)ubuntu und opensuse 10.2 statt.

    Meine ersten Versuche waren mit find -printf, bin aber nicht so richtig weiter gekommen.

    Ich werde mal schauen, ob ich es jetzt so hinbekomme, wie ich mir das vorstelle.

    Zum löschen habe ich gerade sowas hier:

    find $DIR/ -mtime +$AGE -exec rm -r {} \;

    Muß ich mal schauen, warum die Verzeichnisse nicht gelöscht werden.
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Doch noch ne kurze Frage. In der Manpage von find steht:

    Code:
    %Ck    das  Datum der letzten Statusänderung im Format
               der BR strftime " Funktion
    Was bedeutet das? Wenn das irgendeinen Zugriff angibt, wäre es in meinem Fall z.B. die Zeit, an der der Streamingserver die Datei schließt oder? Also die Endzeit. (Oder eben wenn das Backupskript am Verzeichnis vorbeirauscht)

    Noch ne Frage (ich hoffe es nervt nicht). Wo kann ich sowas nachlesen. In der Manpage von find steht ja z.B. nichts über CDATE und TIME drin. Lerne ich das beim C Programmieren oder wie? Edit: habs kapiert, sry für die doofe Frage
     
  5. #4 Wolfgang, 24.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Zu deiner Frage:
    Es ist der Zeitpunkt, an welchem der letzte schreibende Zugriff erfolgte.
    Lesende Zugriffe sind in der Atime.
    Selbst da hast du die Möglichkeit in der Mountoption die atime auszublenden, Option beim Mounten noatime.
    Das macht mitunter Sinn und bringt Performance.

    Für ein Beispielformat habe ich dir meinen Hack hingeschrieben.

    Zur rm mit find:

    Hast du die Rechte zum Löschen für alle Verzeichnisse und enthaltene Dateien?
    Bekommst du eine Fehlermeldung?

    Wenn es nicht nur eine Ebene ist, verwende bei find -depth.
    Dadurch steigt find von der Spitze zur Wurzel.
    Im Defaultmodus kann es passieren dass find in ein Verzeichnis steigen will, was du gerade gelöscht hast.

    Mit -depth verhinderst du das.

    Gruß Wolfgang
     
  6. #5 Sisko78, 24.04.2007
    Sisko78

    Sisko78 Jungspund

    Dabei seit:
    24.04.2007
    Beiträge:
    15
    Zustimmungen:
    0
    Danke, das mit -depth müsste funktionieren.
    Dann hätte ich vermutlich immer noch das Problem mit der Zugehörigkeit der Datei, wenn es über Mitternacht hinaus geht.

    Soll ich das dann mittels if Bedingung behandeln? Also falls 0:xx:xx Uhr, tue es noch zum alten Tag.
     
  7. #6 Wolfgang, 24.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Dann musst du dir ein eigenes Zeitlimit setzen und als Timestamp verwenden.

    GNU date kann das.
    Code:
    $ date -d"2007-04-18 14:19:20 MEST" "+%s"
    1176898760
    
    
    Die Ctime zum Vergleich kannst du auch mit find -printf ausgeben.

    %C@

    Da kannst du dann locker Vergleichen.

    Gruß Wolfgang
     
  8. #7 Sisko78, 24.04.2007
    Sisko78

    Sisko78 Jungspund

    Dabei seit:
    24.04.2007
    Beiträge:
    15
    Zustimmungen:
    0
    Nicht schlecht, ich denke ich werde dank deiner Hilfe was hinbekommen, danke.

    Gruß
    Sisko
     
  9. #8 Sisko78, 26.04.2007
    Sisko78

    Sisko78 Jungspund

    Dabei seit:
    24.04.2007
    Beiträge:
    15
    Zustimmungen:
    0
    Irgendwie komme ich mit den Timestamps doch nicht weiter. In wiefern hilft mir das weiter?

    Habs nochmal mit anderen mitteln versucht, aber da habe ich dann feststellen müssen, dass es problematisch wird bei Monats/Jahreswechsel

    Gruß
    Sisko
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 Wolfgang, 26.04.2007
    Zuletzt bearbeitet: 27.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Dann will ich dir mal etwas helfen:

    Analysieren wir mal das verbleibende Problem:
    1. Du willst Dateien in Verzeichnisse verteilen, die dem Datum+ 1 Stunde entsprechen.
    Das bedeutet:
    2.Erstellungsdatum 01:00:00 UHR + 1 Tag > Timestamp
    Dann ist Erstellungsdatum das richtige Verzeichnis.

    Folglich musst du Vergleichszahlen haben, die numerisch vergleichbar sind.

    Wie kommen wir also an die Werte als Timestamp?

    Wenn wir GNU Date haben ist das sehr leicht.

    Dafür (und nur für GNU date) geht Folgendes:

    Ctime bekommen wir als Wert von find.
    Ctime berücksichtigt aber auch eine nicht geänderte, aber kopierte Datei.
    Also ist eventuell T (Zeit der letzten Änderung) besser geeignet.


    Noch eine Eigenart von GNU date machen wir uns zunutze:
    Ein Datum ohne Zeit gibt uns den Timestamp für 00:00:00 dieses Tages aus.

    Code:
    # find mit Name, Zeit der letzten Änderung im Format YYYY-MM-DD und als Timestamp
    find ./ -maxdepth 1 -type f -printf "%f %TY-%Tm-%Td %T@\n"|
    while read Name Datum Timestamp;
    do
    echo "Dateiname ohne Pfad $Name";
    echo "Datum ohne Zeit $Datum";
    echo "Timestamp $Timestamp";
    # Timestamp für Datum 01:00:00 Uhr + 1 Tag:
    Max="$(date -d"$Datum +1day +1hour" "+%s")";
    MAXF="$(date -d"$Datum +1day +1hour" "+%Y-%m-%d")";
    echo "Max als Timestamp $MAX";
    echo "Max formatiert $MAXF";
    # jetzt können wir zur Probe vergleichen
    if [ $Timestamp -lt $Max ];
    then
    echo "Ziel ist Verzeichnis  $Datum";
    # hier erstellen oder wenn vorhanden kopieren verschieben etc
    else
    echo "Wir brauchen das Datum von MAXF - 1 Tag"
    Target=$(date -d "$MAXF - 1day" "+%Y-%m-%d")
    
    fi;
    done
    
    Ich hoffe die kleine Spielerei mit GNU date wurde verstanden.
    Nun bist du dran.

    Gruß Wolfgang
     
  12. #10 Sisko78, 27.04.2007
    Zuletzt bearbeitet: 27.04.2007
    Sisko78

    Sisko78 Jungspund

    Dabei seit:
    24.04.2007
    Beiträge:
    15
    Zustimmungen:
    0
    Ich glaube, jetzt kann ich folgen, wenn ich was zusammengebastelt habe, kann ich es ja mal hier einstellen.
    Vielen Dank!

    Gruß
    Sisko
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Es hat so irgendwie noch nicht so richtig funktioniert, habe es jetzt noch ein ganz klein bisschen abgeändert, und ich hoffe so tuts das was ich will.
    Was ich allerdings noch anschauen muss ist der Fall, wenn das Skript nicht Zeitnah ausgeführt wird.

    Hier mal meine jetzige Version:
    Code:
    
    DIR=
    DESTINATION=
    cd $DIR
    
    find *.rm -maxdepth 1 -type f -printf "%f %TY-%Tm-%Td %T@ %TH-%TM-%TS\n"|
    while read Name Datum Timestamp Time ;
    do
     # Filename without extension
     newname=${Name/\.rm};
    
     # echo "Dateiname ohne Pfad: $Name";
     # echo "Datum ohne Zeitangabe: $Datum";
     # echo "Timestamp: $Timestamp";
     # echo "Modification time: $Time";
    
     # Timestamp für Datum 01:00:00 Uhr:
     Max="$(date -d"$Datum +1hour" "+%s")";
    
     # echo "Max als Timestamp $Max";
    
     # compare
     if [ $Timestamp -gt $Max ];
     then
     # echo "Ziel ist Verzeichnis: $Datum";
     ([ -d $DESTINATION/$Datum ]) || mkdir $DESTINATION/$Datum;
     cp $Name $DESTINATION/$Datum/$newname-$Time.rm;
     else
     oldDate=$(date -d "$Datum - 1day" "+%Y-%m-%d");
     # echo "Ziel ist Verzeichnis: $oldDate";
     ([ -d $DESTINATION/$oldDate ]) || mkdir $DESTINATION/$oldDate;
     cp $Name $DESTINATION/$oldDate/$newname-$Time.rm;
     fi;
    done
    
     
Thema:

Von Streamingserver angelegte Dateien umbenennen + in Verzeichnisse einordnen

Die Seite wird geladen...

Von Streamingserver angelegte Dateien umbenennen + in Verzeichnisse einordnen - Ähnliche Themen

  1. redhat streamingserver

    redhat streamingserver: Hallo zusammen, ich versuche gerade, einen streamingserver auf redhat enterprise 5 zu installieren. Habe es mit dem darwin versucht, aber da...
  2. id neu-angelegter-adsbenutzer geht nicht, alte schon

    id neu-angelegter-adsbenutzer geht nicht, alte schon: Guten Tag, ich habe ein seltsames Problem. Ich habe ADS Authentifizierung bzgl. Samba / Winbindd. Eigentlich funktioniert alles...