#!/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) " echo " check consistency of links to other video disks for " echo echo "$(basename $0) " echo " move to " echo echo "$(basename $0) " echo " move from to " echo echo " 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