Von Streamingserver angelegte Dateien umbenennen + in Verzeichnisse einordnen

S

Sisko78

Jungspund
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
 
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
 
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
 
Zuletzt bearbeitet:
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
 
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.
 
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
 
Nicht schlecht, ich denke ich werde dank deiner Hilfe was hinbekommen, danke.

Gruß
Sisko
 
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
 
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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Behandlung des IPv6 Formats

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

CSV Datei mit sed manipulieren/optimieren/ergänzen

Schleife zum einlesen vieler Dateien funktioniert nicht

Zurück
Oben