VideoSkripte
Inhaltsverzeichnis: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
Im VDRPortal gibt es mittlerweile eine ganze Reihe von Skripten, die sich um Ordnung auf den Video-Platten kümmern. Hier sollen möglichst alle gesammelt werden.
Video checkskript von SHF
Quelle: http://www.vdr-portal.de/board/thread.php?threadid=73595
Funktionen:
* Verschieben der Aufnahmen: Funktioniert wie es soll. * Löschen leerer Verzeichnisse auf "video0": Repariert (Die nachgerüstete Abfrage auf Nullbyte-001.vdrs war der Übeltäter Augenzwinkern .) * Aufruf für genindex (muss im Pfad sein) hinzugefügt. Bitte testen, ich hab es nicht drauf. * Abfrage ob [0-9][0-9][0-9].vdr vollständig: Hinzugefügt. Bislang wird nur erkannt, ob eine Datei in der Mitte fehlt! Wenn jemand eine Idee hat wie man überprüfen kann ob am Ende was fehlt, dann her damit! * Das Skript hatte Probleme mit Leerzeichen in Dateinamen (das habe ich grundsätzlich nicht!), das sollte jetzt auch behoben sein. Das könnte die merkwürdigen Fehlermeldungen erklären, die Verzeichnisse wurden einfach ignoriert. Es besteht eventuell noch die Möglichkeit, dass es noch mit bestimmten Sonderzeichen Probleme geben kann. Wenn du angeben kannst, was du an Sonderzeichen drin hast, könnte ich nochmal gezielt testen.
Version 4:
#!/bin/bash IFS=" " #Ausgangs-Video-Dir, im allgemeinen /video0 VDIR="/video0" #VDIR="/video0_neu" #Verlinkte Video-Dirs, meist /video1 /video2 ... #VDIR123="/video1 /video2" VDIR123="/video1" # index.vdr, ... auf Video[0-9] sichern # Die Funktion ist nützlich, wenn die Video-Platten neu zusammengestellt werden sollen. # Achtung, der VDR kann die Verzeichnisse dann nicht mehr loeschen! # Für ein "normales" Backup ist es besser Video0 woanders hin zu kopieren. Backup_Infos="no" # index.vdr, ... von Video[0-9] loeschen # Achtung! Beim Wiederherstellen einer Video-Platten-Installation die Funkton beim ersten # Lauf !!! nicht !!! aktivieren, sonst sind die Dateien weg!! Clean_Infos="no" # [0-9][0-9][0-9].vdr Links auf VDIR123 löschen? Warn_Links_on_VDIR123="yes" # Aenderungen machen? Modify="yes" # Keine Rueckfragen # automatic="yes" # VDIR123 typeset -i Checked_Files=0 typeset -i Not_linked=0 typeset -i Not_linked_fixed=0 typeset -i Link_is_not_a_Link=0 typeset -i Link_is_not_a_Link_fixed=0 typeset -i Link_on_VDIR123=0 typeset -i Link_on_VDIR123_fixed=0 typeset -i Link_broken=0 typeset -i Link_broken_fixed=0 typeset -i Wrong_Linktarget=0 typeset -i Wrong_Linkname=0 typeset -i Wrong_Linkname_fixed=0 # VDIR typeset -i Links=0 typeset -i Broken_Links=0 typeset -i Broken_Links_fixed=0 typeset -i Wrong_Linktargetname=0 typeset -i No_Index=0 VDIR=`echo "${VDIR}" | sed -e 's/\/$//' ` # Das muss noch verbessert werden, wenn das Skript die Video-Dirs selbst findet! for i in $VDIR123 ; do # sind die Aufnahmen auch wirklich aufnahmen und keine Links? i=`echo "${i}" | sed -e 's/\/$//' ` echo "Pruefe $i" echo " " # test ob die *.vdr korrekt verlinkt sind: #for j in `find "${i}/" -type f -name "*.vdr"` ; do for h in `find "${i}/" -name "*.rec" -type d 2> /dev/null ` ; do MOVED_DIR="?" # echo "Pruefe $h" # echo " " # Schritt 1: Videodateien ueberpruefen for j in ` find "${h}/" -name "[0-9][0-9][0-9].vdr" 2> /dev/null `; do Checked_Files=$Checked_Files+1 if [ -L $j ] ; then #$j ist ein Link, das sollte nicht so sein! Link_on_VDIR123=$Link_on_VDIR123+1 if [ "$Warn_Links_on_VDIR123" = "yes" ] ; then echo "${j} ist ein Link, das sollte auf ${i} nicht so sein!" if [ "$Modify" = "yes" ] ; then echo "Link loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then rm ${j} if [ $? -eq 0 ]; then echo "... und weg!" Link_on_VDIR123_fixed=$Link_on_VDIR123_fixed+1 else echo "Fehler !!!" fi fi fi echo " " fi continue fi ONAME=`echo "$j" | sed -e "s/${i//\//\\\/}/${VDIR//\//\\\/}/"` PUFFER=`find "$VDIR/" -name "*.vdr" -type l -printf "%h/%f\t%l\n" 2> /dev/null | grep " ${j//\//\\\/}\$" ` LNAME=`echo "$PUFFER" | cut -f 2 ` REAL_ONAME=`echo "$PUFFER" | cut -f 1 ` # ...und pruefen ob eine passende (Link?-)Datei existiert... if [ -e $ONAME ] ; then if [ ! "$j" = "$LNAME" ] ; then echo "$j:" echo "Mehr als ein passender Link auf $VDIR gefunden evtl. Manueller Eingriff noetig!" echo " " fi # ...und pruefen, ob das ein Link ist if [ -L $ONAME ] ; then #$ONAME ist ein Link # Link Ziel feststellen DNAME=`ls -l $ONAME | grep ">" | cut -d ">" -f 2| cut -d " " -f 2` if [ "$DNAME" != "$j" ] ; then # nicht gleich, link zeigt vmtl. falsch file $ONAME | grep -q broken # wenn nicht, Massnahmen ergreifen if [ $? -eq 0 ] ; then Link_broken=$Link_broken+1 echo "Link existiert, ist aber broken! Bei: $j" if [ "$Modify" = "yes" ] ; then echo "Link ersaetzen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then # ln -s -f "$j" "$ONAME" echo "Funktion noch auskommentiert und ungetestet!!!" if [ $? -eq 0 ]; then echo "... Link ersaetzt?" Link_broken_fixed=$Link_broken_fixed+1 else echo "Fehler !!!" fi fi fi else Wrong_Linktarget=$Wrong_Linktarget+1 echo "Link existiert, zeigt aber falsch bei: $j" echo "$ONAME -> $DNAME" echo "Fehler! Manueller Eingriff noetig!" fi echo " " fi # sonst ist alles ok else # kein Link, Datei existiert aber- was nun? Link_is_not_a_Link=$Link_is_not_a_Link+1 echo "Link-Datei existiert, ist aber kein Link! bei: $j" if [ "$Modify" = "yes" ] ; then eingabe="y" echo "Link-Datei loeschen und durch Link ersaetzen?" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then # ln -s -f "$j" "$ONAME" echo "Funktion noch auskommentiert und ungetestet!!!" if [ $? -eq 0 ]; then Link_is_not_a_Link_fixed=$Link_is_not_a_Link_fixed+1 echo "... Link geaendert!" else echo "Fehler !!!" fi fi fi echo " " fi else # $ONAME existiert garnicht ... #LNAME=`find "$VDIR/" -name "*.vdr" -type l -printf "%l\n" 2> /dev/null | grep "^${j//\//\\\/}\$" ` if [ "" = "$LNAME" ] ; then # ... auch kein anderer Link auf die Datei Not_linked=$Not_linked+1 echo "Kein passender Link gefunden bei $j" if [ "$Modify" = "yes" ] ; then echo "Link-Datei erstellen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then ODIRNAME=`dirname "$ONAME"` if [ ! -d $ODIRNAME ] ; then if [ -e $ODIRNAME ] ; then echo "Fehler! $ODIRNAME existiert bereits, ist aber kein Verzeichnis!" break fi mkdir -p "$ODIRNAME" fi ln -s "$j" "$ONAME" if [ $? -eq 0 ]; then Not_linked_fixed=$Not_linked_fixed+1 echo "... Link erstellt!" else echo "Fehler !!!" fi fi fi echo " " else # Passender Link unter anderem Namen gefunden. Wrong_Linkname=$Wrong_Linkname+1 echo "Linkname passt nicht zum Dateinamen $j" # lassen oder Video-Dateien verschieben if [ "$Modify" = "yes" ] ; then LCOUNT=`echo "$LNAME"| grep -c "^${j//\//\\\/}\$" ` if [ "$LCOUNT" = "1" ] ; then # EIN passender Link gefunden echo "Video-Dateien verschieben?" #DDIRNAME=`dirname "$LNAME"` REAL_DNAME=`echo "$REAL_ONAME" | sed -e "s/${VDIR//\//\\\/}/${i//\//\\\/}/"` REAL_DDIRNAME=`dirname "$REAL_DNAME"` if [ ! "$MOVED_DIR" = "$REAL_DDIRNAME" -a ! "$MOVED_DIR" = "?" ] ; then echo "Fehler! Verzeichnis $REAL_DDIRNAME inkonsistent!" fi MOVED_DIR="$REAL_DDIRNAME" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then if [ ! -d $REAL_DDIRNAME ] ; then if [ -e $REAL_DDIRNAME ] ; then echo "Fehler! Datei oder Verzeichnis $DDIRNAME existiert bereits!" break fi mkdir -p "$REAL_DDIRNAME" fi mv "$j" "$REAL_DNAME" if [ $? -ne 0 ]; then echo "Fehler! beim verschieben $j -> $REAL_DNAME$DDIRNAME !" break fi ln -s -f "$REAL_DNAME" "$REAL_ONAME" if [ $? -eq 0 ]; then Wrong_Linkname_fixed=$Wrong_Linkname_fixed+1 echo "... Datei verschoben!" else echo "Fehler !!!" fi fi else # mehrere passende Links gefunden! echo "Fehler! $LCOUNT moegliche Links gefunden manueller Eingriff noetig!" fi fi echo " " fi fi done for J in index marks info resume summary ; do j="${h}/${J}.vdr" Checked_Files=$Checked_Files+1 if [ -L "${j}" ] ; then #$j ist ein Link, das sollte nicht so sein! Link_on_VDIR123=$Link_on_VDIR123+1 if [ "$Warn_Links_on_VDIR123" = "yes" ] ; then echo "${j} ist ein Link, das sollte auf ${i} nicht so sein!" if [ "$Modify" = "yes" ] ; then echo "Link loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then # rm ${j} echo "Funktion noch auskommentiert und ungetestet!!!" if [ $? -eq 0 ]; then Link_on_VDIR123_fixed=$Link_on_VDIR123_fixed+1 echo "... und weg!" else echo "Fehler !!!" fi fi fi echo " " fi continue fi if [ -f "${j}" ] ; then if [ ! -e "${h}/001.vdr" -a ! -L "${h}/001.vdr" ] ; then # Backups in Verzeichnissen ohne 001.vdr ignorieren. if [ "$Backup_Infos" = "yes" ] ; then echo "${j} ist in einem Verzeichnis ohne 001.vdr!" if [ "$Modify" = "yes" ] ; then echo "Datei loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then rm ${j} if [ $? -eq 0 ]; then #_fixed=$_fixed+1 echo "... und weg!" else echo "Fehler !!!" fi fi fi echo " " continue fi fi ONAME=`echo "$j" | sed -e "s/${i//\//\\\/}/${VDIR//\//\\\/}/"` if [ ! -e "${ONAME}" ] ; then ODIRNAME=`dirname "$ONAME"` if [ ! "$MOVED_DIR" = "?" -a -d "$MOVED_DIR" ] ; then $ONAME="${MOVED_DIR}/${J}.vdr" elif [ ! -d "$ODIRNAME" ] ; then echo "Fehler: ${j} keine entsprechendes Verzeichnis auf ${VDIR} gefunden." echo " " break fi echo "Original zur Sicherung ${j} fehlt." if [ "$Modify" = "yes" ] ; then echo "Sicherung zurueckkopieren?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then cp -pu ${j} ${ONAME} if [ $? -eq 0 ]; then #_fixed=$_fixed+1 echo "... Datei kopiert!" else echo "Fehler !!!" fi fi echo " " fi elif [ "${j}" -nt "${ONAME}" ] ; then echo "Info: Sicherung ${j} neuer als Original." if [ "$Modify" = "yes" ] ; then echo "Sicherung zurueckkopieren?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then cp -pu ${j} ${ONAME} if [ $? -eq 0 ]; then #_fixed=$_fixed+1 echo "... Datei kopiert!" else echo "Fehler !!!" fi fi fi echo " " fi if [ $Clean_Infos = "yes" ] ; then echo "${j} sollte nicht auf ${i} sein!" if [ "$Modify" = "yes" ] ; then echo "Datei loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then rm ${j} if [ $? -eq 0 ]; then #_fixed=$_fixed+1 echo "... und weg!" else echo "Fehler !!!" fi fi fi echo " " continue fi fi done found=`find "${h}/" -type d -maxdepth 0 ! -empty 2> /dev/null` if [ "$found" = "" ] ; then echo "Info: Verzeichnis ${h} leer." if [ "$Modify" = "yes" ] ; then echo "Verzeichnis loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then rmdir -p "${h}" echo "... und weg!" fi fi echo " " fi # v nur zum testen! v # if [ $Checked_Files -ge 14 ] ; then # break # fi # ^ nur zum testen! ^ done echo "Pruefung von $i abgeschlossen" echo " " done #Part 2: Welches Video-Dir? # derzeit als Konstante gesetzt, spaeter evtl. selbst finden echo "Pruefe Video_rootdir $VDIR" echo " " for h in `find "${VDIR}/" -name "*.rec" -type d 2> /dev/null ` ; do # echo "h:>$h<" # echo " " #DIR_LINKED="?" #Finde alle *vdr, die ein Symlink sind for i in ` find "${h}/" -name "*.vdr" -type l 2> /dev/null `; do Links=$Links+1 # feststellen, ob der link noch gueltig ist oder nicht file $i | grep -q broken # wenn nicht, Massnahmen ergreifen if [ $? -eq 0 ] ; then Broken_Links=$Broken_Link+1 echo "Broken link bei $i" if [ "$Modify" = "yes" ] ; then echo "Link loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then rm ${i} if [ $? -eq 0 ]; then Broken_Links_fixed=$Broken_Links_fixed+1 echo "... und weg!" else echo "Fehler !!!" fi fi fi echo " " # Next release: suche entsprechende Verzeichnisse # in den anderen Video-Dirs und korrigiere ggf. den Link else DNAME=`ls -l $i | grep ">" | cut -d ">" -f 2| cut -d " " -f 2 ` #INAME2=`echo "$i" | sed -e "s/${VDIR//\//\\\/}//"` INAME=${i//${VDIR}/} echo "$DNAME" | grep -q "${INAME}\$" if [ $? -ne 0 ]; then Wrong_Linktargetname=$Wrong_Linktargetname+1 echo "Info: Linkname passt nicht zum Dateinamen (das sollte eigentlich schon beseitigt sein):" echo "$i -> $DNAME" echo " " fi fi done # Findet, wenn Aufnahmen nicht fortlaufend. # Ob am Ende Teile fehlen kann z.Zt. noch nicht festgestellt werden! typeset -i ki=0 typeset -i kii=0 typeset -i kiii=0 for i in `ls -1 ${h}/[0-9][0-9][0-9].vdr 2> /dev/null `; do #echo "i:>$i<" ki=$ki+1 if [ $ki -gt 9 ] ; then if [ $kii -gt 9 ] ; then kiii=$kiii+1 kii=0 fi kii=$kii+1 ki=0 fi if [ ! "${h}/$kiii$kii$ki.vdr" = "$i" ] ; then echo "Fehler: Aufnahmen nicht fortlaufend in $h!" echo " " continue 2 fi done for J in index marks info resume summary ; do j="${h}/${J}.vdr" if [ -L "${j}" ] ; then LTARGET="" #$j ist ein Link, das sollte nicht so sein! echo "${j} ist ein Link, das sollte nicht so sein!" if [ "$Modify" = "yes" ] ; then LTARGET=`ls -l $j | grep ">" | cut -d ">" -f 2| cut -d " " -f 2 ` echo "Link loeschen und Datei kopieren?" if [ ! -f "${LTARGET}" ] ; then echo "${LTARGET} ist keine Datei!" continue fi eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then # cp -pu ${LTARGET} ${j} echo "Funktion noch auskommentiert und ungetestet!!!" if [ $? -eq 0 ]; then #_fixed=$_fixed+1 echo "... Datei kopiert!" else echo "Fehler !!!" fi fi fi echo " " continue fi if [ -f "${j}" ] ; then if [ "${J}" = "summary" ] ; then echo "Info: ${h}: Alte Aufnahme, summary.vdr gefunden!" fi if [ "$Backup_Infos" = "yes" -a -L "${h}/001.vdr" ] ; then LTARGET=`ls -l "${h}/001.vdr" | grep ">" | cut -d ">" -f 2| cut -d " " -f 2 ` LTARGET=`dirname "${LTARGET}"` LTARGET="${LTARGET}/${J}.vdr" if [ ! -e "${LTARGET}" -o "${j}" -nt "${LTARGET}" ] ; then if [ ! -e "${LTARGET}" ] ; then echo "es gibt bislang noch kein Backup von ${j} Backup erstellen?" else echo "${j} neuer als ${LTARGET} als Backup kopieren?" fi #echo "${j} als Backup nach ${LTARGET} kopieren?" if [ "$Modify" = "yes" ] ; then eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then cp -pu ${j} ${LTARGET} if [ $? -eq 0 ]; then #_fixed=$_fixed+1 echo "... Datei kopiert!" else echo "Fehler !!!" fi fi fi echo " " elif [ ! -f "${LTARGET}" ] ; then echo "Fehler: bearbeite ${j}: ${LTARGET} ist keine Datei!" elif [ "${j}" -ot "${LTARGET}" ] ; then echo "Info: ${j} aelter als ${LTARGET}, das sollte eigehtlich nicht passieren." fi fi elif [ "${J}" = "index" ] ; then No_Index=$No_Index+1 echo "Fehler: kein index.vdr in ${h}!" echo "genindex starten?" if [ "$Modify" = "yes" ] ; then eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then ( cd ${h} genindex ) fi fi echo " " #elif [ "${J}" = "marks" -o "${J}" = "info" ] ; then # zu viele resume.vdr fehlen, ausserdem muss die nicht vorhanden sein. # echo "Info: kein ${J}.vdr in ${h}." # echo " " fi done found=`find "${h}/" -type d -maxdepth 0 -empty 2> /dev/null` if [ ! "$found" = "" ] ; then echo "Info: Verzeichnis ${h} leer." if [ "$Modify" = "yes" ] ; then echo "Verzeichnis loeschen?" eingabe="y" if [ ! "$automatic" = "yes" ] ; then read eingabe fi if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes" ] ; then rmdir -p "${h}" echo "... und weg!" fi fi echo " " continue fi if [ ! -f "${h}/001.vdr" ] ; then echo "Fehler: kein 001.vdr in ${h}!" continue fi if [ ! -s "${h}/001.vdr" ] ; then echo "Fehler: 001.vdr in ${h} hat Groesse 0!" continue fi done echo "Pruefung von Video_rootdir $VDIR abgeschlossen" echo " " echo " " echo "Statistik:" echo "Durchsuchte Links auf $VDIR: $Links, davon broken: $Broken_Links, davon geloescht: $Broken_Links_fixed" echo "Bei $Wrong_Linktargetname Links passt der Name nicht zur Zieldatei." echo "$No_Index Index-Dateien fehlen" echo " " echo "Durchsuchte Dateien: $Checked_Files (auf ${VDIR123})" echo "$Link_on_VDIR123 Videodateien sind Links ($Link_on_VDIR123_fixed geloescht)" echo "Bei $Wrong_Linktarget zeigt der Link auf eine andere Datei!" echo "Bei $Link_broken ist der Link defekt ($Link_broken_fixed neu verlinkt)!" echo "Bei $Link_is_not_a_Link ist der Link kein Link ($Link_is_not_a_Link_fixed Links ersaetzt)!" echo "Bei $Not_linked existiert kein Link ($Not_linked_fixed neu verlinkt)!" echo "Bei $Wrong_Linkname existiert kein Link mit passendem Namen, aber einer mit anderem Namen ($Wrong_Linkname_fixed verschoben)."
Videos auf bestimmte Platte verschieben (HFlor)
Quelle: http://www.vdr-portal.de/board/thread.php?threadid=35507#post324011 bzw. neuere Version per PN
Skript zum Verschieben von Aufnahmen auf andere Platte (und mehr). Beispielanwendung: Meine /video1 Platte liegt auf einem NAS. Manchmal ist dieses nicht erreichbar. Dann wird automatisch auf /video0 aufgenommen (habe den VDR so eingestellt, dass möglichst auf /video1 aufgenommen wird (damit meine ich, dass dort die Video-Dateien hinkommen; die index etc kommen natürlich immer nach /video0).
Nun möchte ich täglich per cron die Aufnahmen, die evtl. auf /video0 gelandet sind nach /video1 verschieben.
Für diesen Anwendungsfall müstest etwas in der Zeile 169 in der Funktion "Sonderfall" ändern, dort steht: code:
local SpezialDir=""
für Dich müste dort dann stehen: code:
local SpezialDir="video1"
damit werden alle Aufnahmen auf /video1 verschoben, soweit dort noch Platz ist.
Den Parameter "AllFiles" habe ich gesetzt, dadurch werden alle Dateien auf das Netzwerklaufwerk verschoben, bei mir ist das ein Raid-System, der vdr hat damit auf seinem /video0 nur Links und keine Platzprobleme
Hier das Skript:
#!/bin/bash test -f /etc/copy_videofiles.conf && . /etc/copy_videofiles.conf test -n "$SVDRSend" || SVDRSend=/usr/bin/svdrpsend.pl # Für Test ob Aufnahme läuft test -n "$Debug" || Debug="" # Debug Ausgabe verbergen mit Debug="> /dev/null" / anzeigen mit Debug="" test -n "$AllFiles" || AllFiles=0 # Bei AllFiles=1 werden auch index.vdr ... verschoben bei AllFiles=0 nur die 001.vdr bis 999.vdr test -n "$AllDirs" || AllDirs=0 # Bei AllDirs=1 werden auch die Verzeichnisse ohne Daten zur Prüfung des erforderlichen Platzes mit eingetragen (trifft erst nach den Verzeichnissen mit Daten zu) test -n "$Reserve" || Reserve=20480 # Platzreserve bei Berechnung Zielverzeichnis test -n "$ErrorLog" || ErrorLog=/cp_err.log # Aufzeichnung der Fehler test -n "$MVOption" || MVOption="" # wenn cp/mv mit Option -g verfügbar (Patch) test 0 -eq $Reserve 2>/dev/null if [ $? -ne 0 ]; then Reserve=20480 fi #todo: # verzeichnisse aufnehmen ohne daten # find /video*/ -type d | awk '{ if ($0 !~ /\/video0\/.*/) { sub(/\/video.\//, ""); if (length($0)) print } }' | more # links erstellen geht nur mit video0 als Hauptverzeichnis LinksUndStatistik () { # Zuerst geloeschte Links wieder herstellen oldifs="$IFS" IFS=$'\n' for File in $(find /video[1-9]/ -type f) do Aufnahme=${File%/*} Aufnahme="/video0${Aufnahme:7}" Datei="$Aufnahme/${File##*/}" Erweiterung="${Aufnahme:(${#Aufnahme}-4)}" if [ "$Erweiterung" = ".rec" -o "$Erweiterung" = ".del" ]; then if [ ! -d "$Aufnahme" ]; then mkdir -p "$Aufnahme" 2>/dev/null fi if [ ! -e "$Datei" ]; then ln -s "$File" "$Datei" 2>/dev/null fi fi done for File in $(find /video1[0-9]/ -type f) do Aufnahme=${File%/*} Aufnahme="/video0${Aufnahme:8}" Datei="$Aufnahme/${File##*/}" Erweiterung="${Aufnahme:(${#Aufnahme}-4)}" if [ "$Erweiterung" = ".rec" -o "$Erweiterung" = ".del" ]; then if [ ! -d "$Aufnahme" ]; then mkdir -p "$Aufnahme" 2>/dev/null fi if [ ! -e "$Datei" ]; then ln -s "$File" "$Datei" 2>/dev/null fi fi done IFS="$oldifs" # Ausgabe der Dateianzahl if [ $DateienAnzahl -gt 0 ]; then echo "insgesamt $DateienAnzahl Dateien mit $DateienGroesse kB verschoben" fi if [ $FehlerDateien -eq 0 -a $FehlerPlatz -eq 0 ]; then echo "Verarbeitung ohne Fehler beendet" fi if [ $FehlerDateien -gt 0 ]; then echo "Es sind $FehlerDateien Fehler bei der Verschiebung der Dateien aufgetreten" fi if [ $FehlerPlatz -gt 0 ]; then echo "Es wurden $FehlerPlatz Aufnahmen nicht bearbeitet, weil nicht ausreichen Platz vorhanden war" fi $SVDRSend mesg "Aufnahmen sortiert ..." 2>&1 >/dev/null } CheckNext () { # Paramter $1 = Hinweis bei Scriptstart, wann nächste Aufnahme beginnt # Test ob eine Aufnahme läuft / gleich beginnt (dann Abbruch des Scriptes) local Next Next=`$SVDRSend Next rel | awk '/^250/ { printf "%d", $3 }'` if [ $Next -lt 0 ] then Next=`expr 0 - $Next` echo "Abbruch: Aufnahme läuft seit $Next Sekunden ($(date -d "-$Next sec" +%T)) ..." >/dev/stderr if [ $# -eq 0 ]; then LinksUndStatistik fi exit 2 fi if [ $Next -lt 300 ] then echo "Abbruch: Aufnahme läuft in $Next Sekunden ($(date -d "+$Next sec" +%T)) los ..." >/dev/stderr if [ $# -eq 0 ]; then LinksUndStatistik fi exit 1 fi if [ $# -gt 0 ]; then echo "Nächste Aufnahme in $Next Sekunden ($(date -d "+$Next sec" +%T))" fi } AufnahmenUmbenennen () { local Link local LinkZiel local LinkName local LinkZielName local LinkZielVolu for Link in `find /video*/ -type l 2>/dev/null` do LinkZiel=`readlink $Link 2>/dev/null` if [ -f $LinkZiel ]; then LinkName=`echo $Link | awk '{ Anzahl = split($0, p, "/"); for (i=3; i < Anzahl; i++) printf "/%s", p[i] }'` LinkZielName=`echo $LinkZiel | awk '{ Anzahl = split($0, p, "/"); for (i=3; i < Anzahl; i++) printf "/%s", p[i] }'` LinkZielVolu=`echo $LinkZiel | awk '{ split($0, p, "/"); printf "%s", p[2] }'` if [ $? -eq 0 ]; then if [ "$LinkName" != "$LinkZielName" ]; then echo "Umbenennung $LinkZiel nach $LinkName" $Debug echo "Wirklich? mkdir -p /$LinkZielVolu$LinkName und mv $LinkZiel /$LinkZielVolu$LinkName/" read mkdir -p /$LinkZielVolu$LinkName 2>/dev/null mv $LinkZiel /$LinkZielVolu$LinkName/ 2>/dev/null fi fi fi done } LoescheLinksUndLeereVerzeichnisse () { # Parameter $1 = "a" wenn auch während der Aufnahme aufgerufen if [ "$1" = "a" ]; then local Link local LinkTarget for Link in `find /video*/ -type l` do LinkTarget=`readlink "$Link"` if [ ! -r "$LinkTarget" ]; then rm "$Link" fi done else find /video*/ -type l -exec rm {} \; fi while true do local Loeschung=0 local Dir for Dir in `find /video*/ -type d -empty 2>/dev/null` do rmdir "$Dir" 2>/dev/null if [ $? -eq 0 ]; then let "Loeschung++" fi done if [ $Loeschung -eq 0 ]; then break fi done } Sonderfall () { # in dieser Funktion kann für bestimmte Ordnernamen ein zugehöriges video?-Verzeichnis festgelegt werden # dieses wird dann als erstes auf freien Platz geprüft local SpezialDir="video1" local i local f=0 case `echo $1 | awk '{ split($0, p, "/"); printf "%s", tolower(p[1]) }'` in xfilme) SpezialDir="video4";; xserien) SpezialDir="video3";; xwissenschaft) SpezialDir="video2";; esac if [ "$SpezialDir" ]; then for (( i = 1; i <= ${#AVolume[@]}; i++ )); do if [ "${AVolume[$i]}" = "$SpezialDir" ]; then ASonder[$i]=2 f=1 break fi done if [ $f -eq 0 ]; then let "Count++" ASonder[$Count]=2 AVolume[$Count]=$SpezialDir ASize[$Count]=0 fi else SpezialDir="notuse" fi echo "Test Sonderfall $SpezialDir [$1]" $Debug } BestimmeFreieGroesse () { # Für alle verwendeten Verzeichnisse wird der freie Platz bestimmt for (( i = 1; i <= ${#AVolume[@]}; i++ )); do AFree[$i]=`df /${AVolume[$i]}/ -P 2>/dev/null | tail -1 | tr -s " " | cut -d\ -f4` if [ ${AFree[$i]} -eq 0 ]; then echo "df hat für ${AVolume[$i]} keinen Wert geliefert" $Debug fi done } TauscheWerte () { # Parameter $1 = 1. Tauschpartner # $2 = 2. Tauschpartner # Hilfsfunktion für Sortierung AFree wird erst nach Sortierung gefüllt local TSonder=${ASonder[$1]} ASonder[$1]=${ASonder[$2]} ASonder[$2]=$TSonder local TVolume=${AVolume[$1]} AVolume[$1]=${AVolume[$2]} AVolume[$2]=$TVolume local TSize=${ASize[$1]} ASize[$1]=${ASize[$2]} ASize[$2]=$TSize return } Sortierung () { # Sortierung der Verzeichnisse nach verwendeter Größe unter Beachtung der Sonderzuweiseung (siehe Sonderfall) let "Comparisons = $Count - 1" Pass=1 while [ $Comparisons -gt 0 ] # Beginning of outer loop (Bubble Sort from http://www.signaltonoise.net/library/Adv-Bash-Scr-HOWTO/arrays.html) do Index=1 # Reset index to start of array after each pass. while [ $Index -lt $Count ] # Beginning of inner loop do let "Next = $Index + 1" Tausch=0 if [ ${ASonder[$Index]} -lt ${ASonder[$Next]} ]; then Tausch=1 elif [ ${ASonder[$Index]} -eq ${ASonder[$Next]} ]; then if [ ${ASize[$Index]} -lt ${ASize[$Next]} ]; then Tausch=1 fi fi if [ $Tausch -eq 1 ]; then # If out of order... TauscheWerte $Index $Next fi let "Index++" done # End of inner loop let "Comparisons -= 1" done # End of outer loop } Verschiebe () { # Parameter $1 = Aufnahmename (Verzeichnis ohne /video?/) # $2 = Zielverzeichnisnummer in AVolume[] # in dieser Funktion werden alle Daten aus den Verzeichnissen <> $2 in das mit der Nummer $2 verschoben local i local Files local File local Target="/${AVolume[$2]}/$1" local Error=0 local ErrorText="" if [ ! -d "$Target" ]; then mkdir -p "$Target" >/dev/null 2>/dev/null fi if [ ! -d "$Target" ]; then echo "Stop: Verzeichnis $Target läst sich nicht anlegen" | tee -a $ErrorLog >/dev/stderr let "FehlerDateien++" return fi for (( i = 1; i <= $Count; i++ )); do if [ $2 -ne $i ]; then if [ $AllFiles -ne 0 ]; then Files=`ls "/${AVolume[$i]}/$1/" -A -1 2>/dev/null` else Files=`ls "/${AVolume[$i]}/$1/" -A -1 2>/dev/null | awk '{ if ($0 ~ /[0-9][0-9][0-9]\.vdr/) printf("%s\n", $0]) }'` fi for File in $Files do if [ $File ]; then echo "Datei: $File von Verzeichnis: ${AVolume[$i]}" $debug if [ -e "$Target/$File" ]; then echo "Stop: Datei [${AVolume[$i]}] $File existiert bereits in $Target" | tee -a $ErrorLog >/dev/stderr let "FehlerDateien++" return fi echo "mv /${AVolume[$i]}/$1/$File $Target/$File" $debug ErrorText=`mv $MVOption "/${AVolume[$i]}/$1/$File" "$Target/$File" 3>&2 2>&1 >&3` Error=$? if [ ! $Error -eq 0 ]; then echo "Stop: Fehlercode $Error [$ErrorText] beim Verschieben der Datei $File Quelle: /${AVolume[$i]}/$1 Ziel: $Target" | tee -a $ErrorLog >/dev/stderr let "FehlerDateien++" return fi if [ ! -e "$Target/$File" ]; then echo "Stop: Datei $File ist nicht angekommen Ziel: $Target" | tee -a $ErrorLog >/dev/stderr let "FehlerDateien++" return fi if [ -e "/${AVolume[$i]}/$1/$File" ]; then echo "Stop: Datei $File ist noch im Quellverzeichnis vorhanden Quelle: /${AVolume[$i]}/$1" | tee -a $ErrorLog >/dev/stderr let "FehlerDateien++" return fi let "DateienAnzahl++" fi done let "DateienGroesse += ${ASize[$i]}" fi done # for i } BearbeiteAufnahme () { # Parameter $1 = Aufnahmename (Verzeichnis ohne /video?/) # Suchen der Dateien für eine Aufnahme, Sortierung und Verschiebung der Daten CheckNext Count=0 unset ASonder unset AVolume unset ASize unset AFree # Suchen aller Verwendeten Aufnahmeverzeichnissen for Dir in `find /video*/$1 -type d` do if [ $AllFiles -ne 0 ]; then Size=`ls $Dir -lA 2>/dev/null | awk '{ total += $5 }; END { printf "%d\n", total / 1024 }'` else Size=`ls $Dir -lA 2>/dev/null | awk '{ if ($9 ~ /[0-9][0-9][0-9]\.vdr/) total += $5 }; END { printf "%d\n", total / 1024 }'` fi Anzahl=0 if [ $Size -eq 0 -a $AllFiles -ne 0 ]; then Anzahl=`ls $Dir -1 2>/dev/null | wc -l` fi if [ $Size -gt 0 -o $Anzahl -gt 0 ]; then # Speichern der Werte für spätere Auswertung in 4 Arrays (Sonderfall, Video-Verzeichnis, verwendete und freie Größe) let "Count++" ASonder[$Count]=1 AVolume[$Count]=`echo $Dir | awk '{ split($0, p, "/"); printf "%s", p[2] }'` ASize[$Count]=$Size fi done # Test auf Spezialverzeichniszuweisung Sonderfall $1 # Sortierung nach belegter Größe Sortierung # Aktuellen freien Platz holen BestimmeFreieGroesse local i if [ ${#AVolume[@]} -gt 1 ]; then # es ist mehr als 1 Verzeichnis vorhanden echo "Aufnahme: $1" $Debug # Ausgabe der gefundenen und sortierten Werte for (( i = 1; i <= $Count; i++ )); do echo "${AVolume[$i]} ${ASize[$i]} ${AFree[$i]}" | awk '{ printf "%-10s Größe =%10d kB Frei =%10d kB\n", $1, $2, $3 }' $Debug done # Suche nach einem Verzeichnis mit genügend Platz für alle Dateien for (( i = 1; i <= $Count; i++ )); do local SizeCopy=$Reserve # (20MB?) Reserve für Berechnung Platzbedarf for (( j = 1; j <= $Count; j++ )); do if [ $i -ne $j ]; then let "SizeCopy += ${ASize[$j]}" fi done if [ $SizeCopy -lt ${AFree[$i]} ]; then # Verzeichnis gefunden, alle Dateien dorthin verschieben let "SizeCopy -= $Reserve" # Reserve abziehen echo "$SizeCopy ${AVolume[$i]}" | awk '{ printf "Verschiebe alles [%10d kB ] nach %s\n", $1, $2 }' $Debug Verschiebe "$1" $i break fi # SizeCopy < Frei if [ $i -eq $Count ]; then echo "Stop: Kein Zielverzeichnis mit ausreichend Platz für alle Dateien gefunden Aufnahme: $1" >/dev/stderr let "FehlerPlatz++" fi done # for i fi } # Begin Hauptprogramm if [ "$1" = "h" ]; then echo "opt l --> Aufnahmen umbenennen und Links löschen" echo "opt n --> Aufnahmen umbenennen, Links löschen und wieder erstellen" echo " ohne die Daten zusammenzufassen" echo "opt a --> Links löschen und wieder erstellen (auch bei Aufnahme!)" echo "opt w --> Aufnahmen umbenennen, Links löschen und Daten zusammenfassen" exit 0 fi DateienAnzahl=0 # insgesamt verschobene Dateien DateienGroesse=0 # insgesamt verschobene Größe (kb) FehlerDateien=0 # bei der Verschiebung sind Fehler aufgetreten FehlerPlatz=0 # bei Prüfen auf freien Platz war keiner mehr da [ -t 1 ] || MVOption="" if [ "$1" != "a" ]; then CheckNext Hinweis echo "Aufnahmen werden umbenant ..." AufnahmenUmbenennen fi echo "Links und leere Verzeichnisse werden entfernt ... (1)" LoescheLinksUndLeereVerzeichnisse $1 if [ "$1" = "l" ]; then exit 0 fi if [ "$1" != "n" -a "$1" != "a" ]; then echo "Dateizusammenfassung ..." if [ $AllDirs -ne 0 ]; then # Alle Aufnahmen werden geprüft Records=`find /video*/ -type d -name *.rec | awk '{ sub(/\/video..?\//, ""); print $1 }' | sort | awk '{ if (line2 != $0) { line2 = $0; print } }'` else # Nur Aufnahmen mit 2 oder mehr Verzeichnissen werden geprüft Records=`find /video*/ -type d -name *.rec | awk '{ sub(/\/video..?\//, ""); print $1 }' | sort | awk '{ if (line1 != $0) line1 = $0; else if (line2 != $0) { line2 = $0; print } }'` fi for Record in $Records do BearbeiteAufnahme $Record done # for Record echo "Links und leere Verzeichnisse werden entfernt ... (2)" LoescheLinksUndLeereVerzeichnisse fi if [ "$1" = "w" ]; then exit 0 fi echo "Erstelle Links ..." LinksUndStatistik