VideoSkripte

Aus VDR Wiki
Wechseln zu: Navigation, Suche

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".
  • 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)."

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




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