VideoSkripte
(→Video checkskript von SHF) |
Hulk (Diskussion | Beiträge) K (Typo's) |
||
(3 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 15: | Zeile 15: | ||
Im wichtigsten Tests im Einzelnen: | Im wichtigsten Tests im Einzelnen: | ||
− | + | * Sucht nach verwaisten Links auf "video0". | |
− | + | * Untersucht, ob alle Dateien auf "video[1...x]" korrekt verlinkt sind und verlinkt sie anderenfalls. | |
− | + | * Verschiebt Aufnahmen, die auf "video0" verschoben wurden auch auf den anderen Videoverzeichnissen, damit die Struktur auf allen Videoverzeichnissen wieder identisch ist. | |
− | + | * Löscht leere Verzeichnisse auf "video0" | |
− | + | * Ruft bei fehlender index.vdr [[genindex]] (muss im Pfad sein) auf um die Indexdatei zu erstellen. | |
− | + | * Abfrage ob [0-9][0-9][0-9].vdr vollständig sind. (Bislang wird nur erkannt, ob eine Datei in der Mitte fehlt!) | |
− | + | * und noch einige Andere ... | |
− | + | ||
− | + | ||
− | + | Die erste Version des Skripts hatte Probleme mit Leerzeichen in Dateinamen, das sollte eigentlich jetzt behoben sein. Es ist nicht gänzlich auszuschließen, dass es noch mit bestimmten Sonderzeichen Probleme geben könnte, bislang ist das aber noch nicht aufgetreten. | |
− | + | ||
− | + | ||
Zeile 44: | Zeile 40: | ||
# index.vdr, ... auf Video[0-9] sichern | # index.vdr, ... auf Video[0-9] sichern | ||
− | # Die Funktion ist | + | # Die Funktion ist nützlich, wenn die Video-Platten neu zusammengestellt werden sollen. |
− | # Achtung, der VDR kann die Verzeichnisse dann nicht mehr | + | # Achtung, der VDR kann die Verzeichnisse dann nicht mehr löschen! |
− | # | + | # Für ein "normales" Backup ist es besser Video0 woanders hin zu kopieren. |
Backup_Infos="no" | Backup_Infos="no" | ||
− | # index.vdr, ... von Video[0-9] | + | # index.vdr, ... von Video[0-9] löschen |
# Achtung! Beim Wiederherstellen einer Video-Platten-Installation die Funkton beim ersten | # Achtung! Beim Wiederherstellen einer Video-Platten-Installation die Funkton beim ersten | ||
# Lauf !!! nicht !!! aktivieren, sonst sind die Dateien weg!! | # Lauf !!! nicht !!! aktivieren, sonst sind die Dateien weg!! | ||
Clean_Infos="no" | Clean_Infos="no" | ||
− | # [0-9][0-9][0-9].vdr Links auf VDIR123 | + | # [0-9][0-9][0-9].vdr Links auf VDIR123 löschen? |
Warn_Links_on_VDIR123="yes" | Warn_Links_on_VDIR123="yes" | ||
− | # | + | # Änderungen machen? |
Modify="yes" | Modify="yes" | ||
− | # Keine | + | # Keine Rückfragen |
# automatic="yes" | # automatic="yes" | ||
Zeile 103: | Zeile 99: | ||
# echo "Pruefe $h" | # echo "Pruefe $h" | ||
# echo " " | # echo " " | ||
− | # Schritt 1: Videodateien | + | # Schritt 1: Videodateien überprüfen |
for j in ` find "${h}/" -name "[0-9][0-9][0-9].vdr" 2> /dev/null `; do | for j in ` find "${h}/" -name "[0-9][0-9][0-9].vdr" 2> /dev/null `; do | ||
Checked_Files=$Checked_Files+1 | Checked_Files=$Checked_Files+1 | ||
Zeile 143: | Zeile 139: | ||
echo " " | echo " " | ||
fi | fi | ||
− | # ...und | + | # ...und prüfen, ob das ein Link ist |
if [ -L $ONAME ] ; then | if [ -L $ONAME ] ; then | ||
#$ONAME ist ein Link | #$ONAME ist ein Link | ||
Zeile 194: | Zeile 190: | ||
if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
Link_is_not_a_Link_fixed=$Link_is_not_a_Link_fixed+1 | Link_is_not_a_Link_fixed=$Link_is_not_a_Link_fixed+1 | ||
− | echo "... Link | + | echo "... Link geändert!" |
else | else | ||
echo "Fehler !!!" | echo "Fehler !!!" | ||
Zeile 757: | Zeile 753: | ||
CheckNext () | CheckNext () | ||
{ | { | ||
− | # | + | # Parameter $1 = Hinweis bei Scriptstart, wann nächste Aufnahme beginnt |
# Test ob eine Aufnahme läuft / gleich beginnt (dann Abbruch des Scriptes) | # Test ob eine Aufnahme läuft / gleich beginnt (dann Abbruch des Scriptes) | ||
Zeile 1.491: | Zeile 1.487: | ||
fi | fi | ||
</pre> | </pre> | ||
+ | |||
+ | [[Kategorie:Skripte]] |
Aktuelle Version vom 23. Januar 2011, 08:55 Uhr
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.
Inhaltsverzeichnis |
[Bearbeiten] Video checkskript von SHF
Quelle: http://www.vdr-portal.de/board/thread.php?threadid=73595
Funktionen:
Das Skript prüft die Videoverzeichnisstruktur auf Fehler und beseitigt diese sofern das automatisch möglich ist. Sollte das nicht möglich sein wird ein entsprechender Hinweis gegeben, damit der Fehler per Hand beseitigt werden kann. (Tipp: Ausgabe in eine Datei umleiten, das Skript ist geschwätzig!)
Im wichtigsten Tests im Einzelnen:
- Sucht nach verwaisten Links auf "video0".
- Untersucht, ob alle Dateien auf "video[1...x]" korrekt verlinkt sind und verlinkt sie anderenfalls.
- Verschiebt Aufnahmen, die auf "video0" verschoben wurden auch auf den anderen Videoverzeichnissen, damit die Struktur auf allen Videoverzeichnissen wieder identisch ist.
- Löscht leere Verzeichnisse auf "video0"
- Ruft bei fehlender index.vdr genindex (muss im Pfad sein) auf um die Indexdatei zu erstellen.
- Abfrage ob [0-9][0-9][0-9].vdr vollständig sind. (Bislang wird nur erkannt, ob eine Datei in der Mitte fehlt!)
- und noch einige Andere ...
Die erste Version des Skripts hatte Probleme mit Leerzeichen in Dateinamen, das sollte eigentlich jetzt behoben sein. Es ist nicht gänzlich auszuschließen, dass es noch mit bestimmten Sonderzeichen Probleme geben könnte, bislang ist das aber noch nicht aufgetreten.
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 löschen! # Für ein "normales" Backup ist es besser Video0 woanders hin zu kopieren. Backup_Infos="no" # index.vdr, ... von Video[0-9] löschen # 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" # Änderungen machen? Modify="yes" # Keine Rückfragen # 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 überprüfen 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 prüfen, 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 geändert!" 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)."
[Bearbeiten] 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 () { # Parameter $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
[Bearbeiten] Checklost
Quelle: http://vdr.unetz.com/download/scripts/videosort/
Dursucht die sekundäre Video-Platte nach nicht-verlinkten Dateien.
#!/bin/bash # this program may format you harddisk, frighten your cat or simply # do what you want - no warranties ################################################################### # # look for unlinked vdr recordings on secondary video-directory # ################################################################### # enter your primary video directory here VIDEO_DIR=/media/video0 ##################################################### # you may not want to change anything after this line #set -x unset LANG export LC_ALL=C VIDEO_BASE=$(echo $VIDEO_DIR | sed 's/[0-9]*$//') MARK_FILE=lostchk.vdr if [ "$VIDEO_DIR" == "$VIDEO_BASE" ]; then echo "$VIDEO_DIR is not base of a distributed video directory" exit 1 fi VIDEO_DIGITS=$(( ${#VIDEO_DIR} - ${#VIDEO_BASE} )) get_video_dir() { local INDEX="$1" local POSTFIX="000$INDEX" echo "$VIDEO_BASE${POSTFIX: $(( - $VIDEO_DIGITS )):$VIDEO_DIGITS}" } echo "prepeare" > /dev/stderr i=0 while [ -a "$(get_video_dir $i)" ]; do find "$(get_video_dir $i)" -name "$MARK_FILE" -exec rm -f {} \; i=$(( $i + 1 )) echo -n "." > /dev/stderr done echo > /dev/stderr echo "check recordings" > /dev/stderr while read DIR; do touch "$DIR/$MARK_FILE" REC_NAME="${DIR#$VIDEO_DIR}" REC_NAME="${REC_NAME#/}" i=1 while true; do REC="00$i" REC="${REC: -3:3}.vdr" REC_FILE="$DIR/$REC" if [ -e "$REC_FILE" ]; then if [ -h "$REC_FILE" ]; then LINK_DEST="$(readlink "$REC_FILE")" DEST_DIR="$(dirname "$LINK_DEST")" touch "$DEST_DIR/$MARK_FILE" fi else break; fi i=$(( $i + 1 )) done echo -n "." > /dev/stderr done < <(find "$VIDEO_DIR" -name "*.rec" -o -name "*.del") echo > /dev/stderr echo "find lost recordings" > /dev/stderr i=0 while [ -e "$(get_video_dir $i)" ]; do while read DIR; do if [ '!' -e "$DIR/$MARK_FILE" ]; then echo > /dev/stderr echo $DIR fi echo -n "." > /dev/stderr done < <(find "$(get_video_dir $i)" -name "*.rec" -o -name "*.del") i=$(( $i + 1 )) done echo > /dev/stderr echo "clean up" > /dev/stderr i=0 while [ -a "$(get_video_dir $i)" ]; do find "$(get_video_dir $i)" -name "$MARK_FILE" -exec rm -f {} \; i=$(( $i + 1 )) echo -n "." > /dev/stderr done echo > /dev/stderr
[Bearbeiten] MvVideo
Quelle: http://vdr.unetz.com/download/scripts/videosort/
Verschiebt einzelne Aufnahmen oder ganze Verzeichnisse samt Unterverzeichnissen auf eine andere Platte und verlinkt sie korrekt.
mvvideo.sh <recording> check consistency of links to other video disks for <recording> mvvideo.sh <recording> <dstVideoDir> move <recording> to <dstVideoDir> mvvideo.sh <recording> <srcVideoDir> <dstVideoDir> move <recording> from <srcVideoDir> to <dstVideoDir> <recording> may be a single recording or a complete recording tree
#!/bin/bash # # Copyright 2006 Ralf Mueller ralf @ bj - ig . de # # GPL v2 # # Move vdr video files between different video disks # # Using this script only makes sense if you have more then one # video directory for you vdr # # When stopping this script while moving data you may create # lost files on the destination video directory - this should # _not_ result in a lost recording but "only" in lost space! Have a look # at you copy destination if you have to stop this script. # # This script is provided as is - it may scare you pet, it may dry up # plants, it may even clear your disk - you use it at your own risk. # unset LANG export LC_ALL=C MIN_FREE=8000 # GB VIDEO_DIR=/media/video0 #set -x if [ "$1" == "" -o "$1" == "--help" ]; then echo "Usage:" echo "$(basename $0) <recording>" echo " check consistency of links to other video disks for <recording>" echo echo "$(basename $0) <recording> <dstVideoDir>" echo " move <recording> to <dstVideoDir>" echo echo "$(basename $0) <recording> <srcVideoDir> <dstVideoDir>" echo " move <recording> from <srcVideoDir> to <dstVideoDir>" echo echo "<recording> may be a single recording or a complete recording tree" exit 0 fi if [ '!' -d "$VIDEO_DIR" ]; then VIDEO_DIR=/media/video.0 fi if [ '!' -d "$VIDEO_DIR" ]; then VIDEO_DIR=/video0 fi if [ '!' -d "$VIDEO_DIR" ]; then VIDEO_DIR=/video.0 fi if [ '!' -d "$VIDEO_DIR" ]; then echo "You may want to adapt the VIDEO_DIR variable on top of this script" exit 1 fi IONICE=$(type -p ionice) VIDEO_BASE=$(echo $VIDEO_DIR | sed 's/[0-9]*$//') if [ "$TIME_REF" == "" -o '!' -r "$TIME_REF" ]; then export TIME_REF="/tmp/mvvideo-timeref.$$" touch "$TIME_REF" MY_TIME_REF="$TIME_REF" sleep 2 fi if [ "$VIDEO_DIR" == "$VIDEO_BASE" ]; then echo "$VIDEO_DIR is not base of a distributed video directory" >/dev/stderr exit 1 fi RECORDING="$1" RECORDING="${RECORDING%/}" if [ "${RECORDING#/}" == "$RECORDING" ]; then RECORDING="$(pwd)/$RECORDING" fi if [ '!' -d "$RECORDING" ]; then echo "'$RECORDING' is not a recording directory" >/dev/stderr exit 1 fi absPath() { local DIR="$1" if [ -d "$DIR" ]; then (cd "$DIR"; pwd) else (cd $(dirname "$DIR"); pwd) fi } RECORDING_BASE=$(absPath "$RECORDING") RECORDING_BASE="${RECORDING_BASE#$VIDEO_DIR}" if [ "$RECORDING_BASE" == "$RECORDING" ]; then echo "The base of '$RECORDING' is not on '$VIDEO_DIR'" >/dev/stderr exit 1 fi RECORDING_BASE="${RECORDING_BASE#/}" if [ "${RECORDING%.rec}" == "$RECORDING" ]; then find "$RECORDING" -xtype d -name "*.rec" -exec "$0" "{}" "$2" "$3" \; exit 0 fi P_DST_VIDEO_DIR="$2" if [ "$3" != "" ]; then P_SRC_VIDEO_DIR="$2" P_SRC_VIDEO_DIR="${P_SRC_VIDEO_DIR%/}" P_DST_VIDEO_DIR="$3" fi P_DST_VIDEO_DIR="${P_DST_VIDEO_DIR%/}" checkSize() { local DIR="$1" local MEDIA M_SIZE M_USE M_FREE M_PERCENT M_MOUNT read MEDIA M_SIZE M_USE M_FREE M_PERCENT M_MOUNT < <(df -kP -B1M "$DIR" | tail -1 ) if [ "$M_FREE" -gt "$MIN_FREE" ]; then # echo "enough space left: $M_FREE" return 0 fi # echo "not enough space left: $M_FREE" return 1 } mvFile() { local RECORDING="$1" local SRC_FILE="$2" local DST_DIR="$3" local FILE_NAME="$(basename "$SRC_FILE")" if [ '!' -h "$DST_DIR/$FILE_NAME" -a -f "$DST_DIR/$FILE_NAME" ]; then echo "there already is a file called '$DST_DIR/$FILE_NAME'. bailing out." >/dev/stderr exit 1 fi mkdir -p "$DST_DIR" if checkSize $DST_DIR; then if [ -x "$IONICE" ]; then "$IONICE" -c3 mv "$SRC_FILE" "$DST_DIR" else mv "$SRC_FILE" "$DST_DIR" fi # remove old symbolic links if [ -h "$RECORDING/$FILE_NAME" ]; then rm "$RECORDING/$FILE_NAME" fi # don't create links if we moved the file to video0 if [ '!' -r "$RECORDING/$FILE_NAME" ]; then ln -s "$DST_DIR/$FILE_NAME" "$RECORDING/$FILE_NAME" fi rmdir -p "$(dirname "$SRC_FILE")" 2>/dev/null else echo "not enough space on '$DST_DIR'" >/dev/stderr exit 1 fi } i=1 echo "processing: $RECORDING_BASE" >/dev/stderr while true; do REC="00$i" REC="${REC: -3:3}.vdr" if [ '!' -r "$RECORDING/$REC" ]; then if [ "$i" -le "1" -a '!' -r "$RECORDING/dvd.vdr" ]; then echo "no data in '$RECORDING'" >/dev/stderr fi exit 0 fi if [ -h "$RECORDING/$REC" ]; then LINK="$(readlink "$RECORDING/$REC")" REC_DIR="${LINK%/[0-9][0-9][0-9].vdr}" REC_DIR="$(absPath "$REC_DIR")" else REC_DIR="$(absPath "$RECORDING")" fi REC_VIDEO_DIR=$(echo "$REC_DIR" | sed "s#^\\($VIDEO_BASE[0-9]*\\)/.*"#\\1#) if [ "${REC_VIDEO_DIR#$VIDEO_BASE}" == "$REC_VIDEO_DIR" ]; then echo "'$REC_DIR' is not on a valid video directory" >/dev/stderr exit 1 fi if [ "$P_SRC_VIDEO_DIR" != "" -a "$P_SRC_VIDEO_DIR" != "$REC_VIDEO_DIR" ]; then i=$(( $i + 1 )) continue; fi if [ "$REC_DIR/$REC" -nt "$TIME_REF" ]; then echo "skipping active recording '$RECORDING'" > /dev/stderr i=$(( $i + 1 )) continue; fi REC_BASE=${REC_DIR#$REC_VIDEO_DIR/} if [ "$REC_BASE" != "$RECORDING_BASE" ]; then echo "reorder: mvFile '$REC_BASE/$REC' to '$RECORDING_BASE/$REC'" mvFile "$RECORDING" "$REC_DIR/$REC" "$REC_VIDEO_DIR/$RECORDING_BASE" continue; fi if [ "$P_DST_VIDEO_DIR" != "" ]; then if [ "${P_DST_VIDEO_DIR#$VIDEO_BASE}" != "$P_DST_VIDEO_DIR" ]; then DST_VIDEO_DIR="$P_DST_VIDEO_DIR" else echo "'$P_DST_VIDEO_DIR' is not a valid video directory" >/dev/stderr exit 1 fi fi if [ "$DST_VIDEO_DIR" == "" ]; then DST_VIDEO_DIR="$REC_VIDEO_DIR" fi if [ "$DST_VIDEO_DIR" != "$REC_VIDEO_DIR" ]; then echo "new disk: mvFile '$REC_DIR/$REC' to '$DST_VIDEO_DIR'" mvFile "$RECORDING" "$REC_DIR/$REC" "$DST_VIDEO_DIR/$RECORDING_BASE" fi echo "done: $REC" i=$(( $i + 1 )) touch "$VIDEO_DIR/.update" done if [ "$MY_TIME_REF" != "" ]; then rm "$MY_TIME_REF" fi