VideoSkripte
Henfri (Diskussion | Beiträge) |
Henfri (Diskussion | Beiträge) (→Videos auf bestimmte Platte verschieben (HFlor)) |
||
| Zeile 652: | Zeile 652: | ||
==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 | ||
| + | |||
Skript zum Verschieben von Aufnahmen auf andere Platte (und mehr). Beispielanwendung: | 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). | 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). | ||
Version vom 21. Februar 2009, 17:06 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.
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