Buscar
 
 

Resultados por:
 


Rechercher Búsqueda avanzada

Navegación
 Índice
 Wiki
 FAQ del foro
 FAQ del VDR-NG-EM
 Funcionalidades del VDR
 Mejoras del VDR-NG-EM
 Primeros pasos FW-VDR
 Descargas VDR-NG-EM
Flujo RSS


Yahoo! 
MSN 
AOL 
Netvibes 
Bloglines 



Volver a mostrar grabaciones despues de reparticionar

Ver el tema anterior Ver el tema siguiente Ir abajo

Volver a mostrar grabaciones despues de reparticionar

Mensaje por atinar el Dom 30 Nov 2008 - 23:09

Hola,
Después de reparticionar el disco para mejorar el rendimiento, siguiendo los consejos de otro hilo, me encontré con que solo se mostraban las grabaciones que había dejado en la primera partición.
He mirado lo que hace el vdr para que se vean las grabaciones hechas después de reparticionar y resulta que siempre crea enlaces a los archivos XXX.vdr en la primera partición ( y los archivos info.vdr e index.vdr se graban siempre ahí).
Para que me volvieran a aparecer las grabaciones, en lugar de dedicar media hora a hacerlo manualmente, decidí escribir un script (pensando que sería más rápido). Me llevó unas cuantas horas, pero como me ha funcionado, lo pongo aquí por si a alguien más le interesa (eso sí, el que lo ejecute, que lo haga bajo su propia responsabilidad). Es una de las primeras cosas que perpetro en bash, así que si hay alguna chapuza, sed indulgentes. Me parece que no puedo adjuntar archivos así que :
Código:
#!/bin/sh
# Utilidad para crear en video0 los enlaces que falten a grabaciones en las otras particiones.
# Se recomienda sincronizar antes los directorios en las diferentes particiones para no duplicar directorios
# con diferente nombre.
# Autor: atinar.
# Email: atinar1 at hotmail dot com.
# Usalo bajo tu propia responsabilidad.

# Determina si se van a borrar los listados al terminar
borrarrastrodelcrimen=false

# Salir si se esta ejecutando vdr
[ -f /var/run/runvdr.pid ] && logger -s "Detener vdr antes de restaurar directorios de video." && exit 1

# Buscar directorio real al que corresponde video0
video0=`readlink /var/vdr/video0`

# Formatear texto para simplificar sed
video0tr=`echo $video0 | tr / \~`

# Preparar directorio donde se guardan las listas de archivos y directorios a procesar
TMP=${video0}/tmp/restaurar
if [ ! -d ${TMP} ]; then
  mkdir -p ${TMP}
fi;

# Generar listado con todos los archivos *.vdr en directorios de grabaciones que no esten en video0
if [[ -f ${TMP}/fdst ]]; then rm ${TMP}/fdst; fi
for video in `find /var/vdr -regex /var/vdr/video.* -type l` ; do
    if [[ $video != /var/vdr/video0  ]]; then
        find $video -follow -regex ".*/[0123456789.-]*\.rec/[^/]*\.vdr" -type f | sort >> ${TMP}/fdst
    fi
done

# Crear listado con las ordenes de creacion de los enlaces simbolicos que falten.
# Aun no se crean los enlaces, solo directorios vacios en video0.
if [ -f ${TMP}/a1fori_ln ]; then rm ${TMP}/a1fori_ln; fi;
for dst in `cat ${TMP}/fdst`; do
    dsttr=`echo $dst | tr / \~`
    oritr=`echo $dsttr | sed 's/~var~vdr~video[^~]*~/~var~vdr~video0~/'`
    oripathtr=`echo $oritr | sed 's/~[^~]*\.vdr//'`
    oripath=`echo $oripathtr | tr \~ /`
    if [[ ! -e $oripath ]]; then
        mkdir -p $oripath
    fi
    if [[ -d $oripath ]]; then
        ori=`echo $oritr | tr \~ /`
        if [[ ! -e $ori ]]; then
            echo "ln -s $dst $ori" >> ${TMP}/a1fori_ln
        fi
    fi
done

# Generar los enlaces
[[ -f ${TMP}/a1fori_ln ]] && source ${TMP}/a1fori_ln

# Borrar listados.
if [ ${borrarrastrodelcrimen} ]; then
    if [ -e ${TMP}/a1fori_ln ]; then rm ${TMP}/a1fori_ln; fi
fi

Tampoco se mantienen sincronizados los nombres de los directorios en las diferentes particiones. Es decir, si se renombra una grabación se cambian los nombres en la primera partición, pero no en la(s) partición(es) donde están realmente las grabaciones, así que el script anterior podría volver a crear enlaces duplicados a la misma grabación. Para evitarlo y como no había perdido suficiente tiempo todavía, he escrito otro script que lo que hace es renombrar los directorios tal como están en la primera partición. Está pensado para que se ejecute antes que el anterior (y periodiodicamente si alguien es tan caprichoso como yo y le importa esta diferencia de nombres). Lo mismo que antes, la responsabilidad de usarlo es de cada cual:
Código:
#!/bin/sh
# Utilidad para sincronizar directorios de grabaciones en las distintas particiones.
# Autor: atinar.
# Email: atinar1 at hotmail dot com.
# Usalo bajo tu propia responsabilidad.

# Determina si se van a borrar los listados al terminar
borrarrastrodelcrimen=false

# Salir si se esta ejecutando vdr
[ -f /var/run/runvdr.pid ] && logger -s "Detener vdr antes de sincronizar directorios de video." && exit 1

# Buscar directorio real al que corresponde video0
video0=`readlink /var/vdr/video0`

# Formatear texto para simplificar sed
video0tr=`echo $video0 | tr / \~`

# Preparar directorio donde se guardan las listas de archivos y directorios a procesar
TMP=${video0}/tmp/sincronizar
if [ ! -d ${TMP} ]; then
  mkdir -p ${TMP}
fi;

# Buscar directorios de grabaciones en video0
find $video0 -regex ".*/[0123456789.-]*\.rec" -type d | sort -u > ${TMP}/doripath

# Borrar listados antiguos
if [ -e ${TMP}/fori ]; then rm ${TMP}/fori; fi;
if [ -e ${TMP}/doripath_sinc_tmp ]; then rm ${TMP}/doripath_sinc_tmp; fi;
if [ -e ${TMP}/ddstpathnew ]; then rm ${TMP}/ddstpathnew; fi;
if [ -e ${TMP}/ddstpathold ]; then rm ${TMP}/ddstpathold; fi;
if [ -e ${TMP}/ddstpathold_tmp ]; then rm ${TMP}/ddstpathold_tmp; fi;
if [ -e ${TMP}/a1fori_rm ]; then rm ${TMP}/a1fori_rm; fi;
if [ -e ${TMP}/a2fdst_mv ]; then rm ${TMP}/a2fdst_mv; fi;
if [ -e ${TMP}/a3fori_ln ]; then rm ${TMP}/a3fori_ln; fi;

# Buscar enlaces simbolicos en directorios de grabaciones de video0
for oripath in `cat ${TMP}/doripath` ; do
    if [[ $oripath -nt ${oripath}/.sinc ]]; then
        find $oripath -regex ".*\.vdr" -type l >> ${TMP}/fori
        echo $oripath >> ${TMP}/doripath_sinc_tmp
    fi;
done

# Generar listado de directorios que se van a marcar como sincronizados
if [ -f ${TMP}/doripath_sinc_tmp ]; then
    cat ${TMP}/doripath_sinc_tmp | sort -u > ${TMP}/doripath_sinc
    rm ${TMP}/doripath_sinc_tmp;
fi;

# Generar listados de enlaces con rutas destinas en destino
for ori in `cat ${TMP}/fori` ; do
    oritr=`echo $ori | tr / \~`
    dst=`readlink $ori`
    dsttr=`echo $dst | tr / \~`
    oripathtr=`echo $oritr | sed 's/~[^~]*\.vdr//'`
    dstpathtr=`echo $dsttr | sed 's/~[^~]*\.vdr//'`
    SED_CMD="'s/$video0tr~//'"
    orisubpathtr=`eval "echo $oripathtr | sed $SED_CMD"`
    dstsubpathtr=`echo $dstpathtr | sed 's/~var~vdr~video[1-9]~//'`
    if [[ $orisubpathtr != $oripathtr && $dstsubpathtr != $dstpathtr && $orisubpathtr != $dstsubpathtr ]] ; then
        SED_CMD="'s/$dstsubpathtr/$orisubpathtr/'"
        dstpathnewtr=`eval "echo $dstpathtr | sed $SED_CMD"`
        dstpathnew=`echo $dstpathnewtr | tr \~ /`
        if [[ $dstpathnewtr != $dstpathtr ]]; then
            if [[ ! -d $dstpathnew ]]; then
                echo $dstpathnew >> ${TMP}/ddstpathnew
                mkdir -p $dstpathnew;
            fi
            if [[ -d $dstpathnew ]]; then
                SED_CMD="'s/$dstpathtr/$dstpathnewtr/'"
                dstnewtr=`eval "echo $dsttr | sed $SED_CMD"`
                dstnew=`echo $dstnewtr | tr \~ /`
                if [[ ! -f $dstnew ]]; then
                    echo "rm $ori" >> ${TMP}/a1fori_rm
                    echo "mv $dst $dstpathnewtr" | tr \~ / >> ${TMP}/a2fdst_mv
                    echo "ln -s $dstnewtr $ori" | tr \~ / >> ${TMP}/a3fori_ln
                    echo "$dstpathtr" | tr \~ / >> ${TMP}/ddstpathold_tmp
                else
                    echo "$dstnew" >> ${TMP}/f5dst_existe
                fi;
            fi;
        fi;
    fi;
done

# Generar listado de directorios en video[12...] que van a quedar obsoletos
if [ -e ${TMP}/ddstpathold_tmp ]; then
    cat ${TMP}/ddstpathold_tmp | sort -u > ${TMP}/ddstpathold
    rm ${TMP}/ddstpathold_tmp
fi

# Realizar la sincronizacion.
# Hasta aqui no se ha hecho nada que pueda ser perjudical, como mucho crear
# unos cuantos directorios vacios.
if [ -f ${TMP}/a1fori_rm && -f ${TMP}/a2fdst_mv && -f ${TMP}/a3fori_ln  ]; then
    source ${TMP}/a1fori_rm
    source ${TMP}/a2fdst_mv
    source ${TMP}/a3fori_ln
fi

# Borrar directorios obsoletos que hayan quedado vacios
if [ -f ${TMP}/ddstpathold ]; then
    for dstpathold in `cat ${TMP}/ddstpathold` ; do
        if [[ -d $dstpathold ]]; then
            find $dstpathold -follow -type f -size 0c -exec rm '{}' \;
            rmdir -p $dstpathold 2> /dev/null
        fi
    done
    if [ ${borrarrastrodelcrimen} ]; then rm ${TMP}/ddstpathold; fi
fi

# Poner marca de sincronizacion
if [ -f ${TMP}/doripath_sinc ]; then
    for oripath in `cat ${TMP}/doripath_sinc`; do
        touch ${oripath}/.sinc
    done
    if [ ${borrarrastrodelcrimen} ]; then rm ${TMP}/doripath; fi
fi

# Borrar listados.
if [ ${borrarrastrodelcrimen} ]; then
    if [ -e ${TMP}/a1fori_rm ]; then rm ${TMP}/a1fori_rm; fi
    if [ -e ${TMP}/a2fdst_mv ]; then rm ${TMP}/a2fdst_mv; fi
    if [ -e ${TMP}/a3fori_ln ]; then rm ${TMP}/a3fori_ln; fi
fi

atinar
Desarrollador

Cantidad de envíos : 278
Fecha de inscripción : 06/09/2008

Ver perfil de usuario

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.