VideoSkripte
Henfri (Diskussion | Beiträge) |
(→Video checkskript von SHF) |
||
| Zeile 6: | Zeile 6: | ||
==Video checkskript von SHF== | ==Video checkskript von SHF== | ||
Quelle: http://www.vdr-portal.de/board/thread.php?threadid=73595 | Quelle: http://www.vdr-portal.de/board/thread.php?threadid=73595 | ||
| + | |||
Funktionen: | 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!) |
| − | + | ||
| − | * Abfrage ob [0-9][0-9][0-9].vdr vollständig | + | Im wichtigsten Tests im Einzelnen: |
| − | Bislang wird nur erkannt, ob eine Datei in der Mitte fehlt! | + | * Sucht nach verwaisten Links auf "video0" auf. |
| − | + | * 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. | |
| − | Es | + | * 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!) | ||
| + | * ... | ||
| + | |||
| + | * 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 aufgertreten. | ||
| Zeile 650: | Zeile 658: | ||
---- | ---- | ||
| + | |||
==Videos auf bestimmte Platte verschieben (HFlor)== | ==Videos auf bestimmte Platte verschieben (HFlor)== | ||
Quelle: http://www.vdr-portal.de/board/thread.php?threadid=35507#post324011 bzw. neuere Version per PN | Quelle: http://www.vdr-portal.de/board/thread.php?threadid=35507#post324011 bzw. neuere Version per PN | ||
Version vom 18. März 2009, 21:32 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 |
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" auf.
* 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!)
* ...
* 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 aufgertreten.
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
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
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