Ayuda!! Programacion Bash, Crear un indice de películas y compartirlas con linux

Imagen de santi2808
0 puntos

Saludos,

Seguramente se trate de algo simple, pero no doy con ello.
Hay que decir, claro que soy principiante en esto del Bash.

El problema intento encontrar la primera posición en la que se encuentra un caracter dentro de una cadena, y funciona perfectamente excepto cuando en la cadena hay un carácter especial, como una 'ñ'.

el código que utilizo es:
posicionprimersimbolo=$(echo `expr index "$nombreficherosinprimerapalabra" [\.\[\,\(]`)

en el caso de que en la cadena se encuentre una ñ me da un valor mayor.

Seguro que hay otra manera de hacerlo, pero no la conozco

Gracias por la ayuda!!!!

Imagen de razaAztk
+1
0
-1

Lo que pasa es que para representar la el caracter 'ñ' es necesario dos bytes, el por ello que el indice incrementa en uno por cada ñ (u otro caracter que use dos bytes). Cómo solucionarlo? No se.

Pero que es lo que necesitas hacer? quitarle la extensión a un fichero?

Saludos!

+1
0
-1

void hey(int x,int y)
{
if (x && y)
 printf("http://libertadhack.blogspot.com/");
else
 printf("http://libertadpunk.blogspot.com/");
}
Imagen de santi2808
+1
0
-1

Saludos,

Gracias por la respuesta y de paso explicaré que es lo que quiero hacer exactamente.
Entiendo que puede ser algo útil para mucha gente.
En mi caso, además me hace ponerme un poco al día con el Bash, pues es un lenguaje que no conocía demasiado.

He decidido quitar de la estantería mi colección de películas en dvd y hacer copias de seguridad digitales y guardarlas en un disco duro. (Hay que explicarlo así, claro)
Pongamos por caso en el subdirectorio:

/PELIS-01/todas las películas del mundo.avi

como ejemplo pongo un listado de algunas de ellas:

$ find FICHEROS/ > lista
$ cat lista

PELIS-01/
PELIS-01/Looney Tunes 1, Lo mejor de Bugs Bunny [INFANTIL].avi
PELIS-01/Woody Allen - Sombras y Niebla [DRAMA].avi
PELIS-01/El Proyecto Andromeda [SCIFI+FANTASTICA].avi
PELIS-01/Yacimiento Lunar [SCIFI+ESPACIO] [CLASICO].avi
PELIS-01/Llegaron del Espacio [SCIFI+ESPACIO].avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/Thumbs.db
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/Acci??n confidencial.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/La vida adentro.Kevin Peter Hall.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/El dise??o de los personajes.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/No bebas de esta agua.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/La Impaciente.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/Asi se hizo Depredador.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/El Arnold desconocido.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/Bienvenidos a la Selva.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/Camuflaje.avi
PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva.srt
PELIS-01/Historias Macabras (Pablo Carrero). 3 Cortos Cine [DRAMA].avi
PELIS-01/Jaimito En Rusia [COMEDIA].avi
PELIS-01/Dinosaurios, Walt Disney [INFANTIL].avi

Como se puede ver hay pelis y subdirectorios dentro de los cuales hay más pelis, o substítulos o lo que sea.
Lo único que me interesa extraer son los nombres de archivo y subdirectorios. Más concretamente y para empezar, aquellos que estén "catalogados" (los que tienen simbolo '\[' )

$ find ./FICHEROS/ -name '*\[*' > lista
$ cat lista
./PELIS-01/Looney Tunes 1, Lo mejor de Bugs Bunny [INFANTIL].avi
./PELIS-01/Woody Allen - Sombras y Niebla [DRAMA].avi
./PELIS-01/El Proyecto Andromeda [SCIFI+FANTASTICA].avi
./PELIS-01/Yacimiento Lunar [SCIFI+ESPACIO] [CLASICO].avi
./PELIS-01/Llegaron del Espacio [SCIFI+ESPACIO].avi
./PELIS-01/Depredador [SCIFI+FANTASTICA] [ACCION]
./PELIS-01/Historias Macabras (Pablo Carrero). 3 Cortos Cine [DRAMA].avi
./PELIS-01/Jaimito En Rusia [COMEDIA].avi
./PELIS-01/Dinosaurios, Walt Disney [INFANTIL].avi

Ahora si que ha aparecido un listado real de todas las películas "catalogadas" que tengo en el subdirectorio ./PELIS-01/

El sistema que he utilizado para catalogarlas es como se puede ver utilizar campos como:

[INFANTIL]
[DRAMA]
[SCIFI+FANTASTICA]
[SCIFI+ESPACIO] [CLASICO]
[SCIFI+FANTASTICA] [ACCION]
[DRAMA]
[COMEDIA]
[INFANTIL]

¿Cómo funcionan? Bueno, supongo que se podrá deducir. Hay películas que están catalogadas de varias maneras.

La idea es crear un script que haba básicamente 4 cosas.

*****La primera:
Crear un arbol de directorios por cada catalogación encontrada. "Useasé", tal como:

./LINKS/INFANTIL/
./LINKS/DRAMA/
./LINKS/SCIFI/
./LINKS/SCIFI/FANTASTICA/ # <------- Por eso está el simbolo '+'
./LINKS/SCIFI/ESPACIO/
./LINKS/ACCION/
./LINKS/SCIFI/
./LINKS/COMEDIA/

A más catalogaciones, más directorios.

*****La segunda:
Hay que colocar un link de cada película dentro de su subdirectorio.

algo parecido a:

$ ln -s ./FICHEROS/Looney\ Tunes\ 1\,\ Lo\ mejor\ de\ Bugs\ Bunny\ \[INFANTIL\].avi ./LINKS/INFANTIL/Looney\ Tunes\ 1\,\ Lo\ mejor\ de\ Bugs\ Bunny\ \[INFANTIL\].avi

o bien...

$ ln -s './FICHEROS/Looney Tunes 1, Lo mejor de Bugs Bunny [INFANTIL].avi' './LINKS/INFANTIL/Looney Tunes 1, Lo mejor de Bugs Bunny [INFANTIL].avi'


...
(Así con cada uno de los ficheros encontrados)

De esta manera cuando quiera ver una peli (por ejemplo desde el disco duro multimedia conectado a la red) sólo tengo que ir al grupo de películas que me interese.

Así es como lo hago actualmente, solo que en vez de tener un link como en el ejemplo. Tengo copiada la película directamente. Y solo apunto mediante links los diferentes subdirectorios de categorías que tengo repartidos por todo el ordenador en diferentes discos duros (problemas de espacio).

Pero hay una carencia importante con mi método actual, y es que hay tantas pelis que es muy difícil una en concreto. Pues vete tu a saber de que manera se ha catalogado (en mi caso actual en que dichoso directorio dichoso se ha metido) pues al ser copiada la película físicamente en el subdirectorio sólo está copiada en uno único (como es lógico)
Así que con este nuevo método se evita (en parte) este problema. La solución definitiva.
A continuación...

*****La tercera cosa que debería hacer el scrip:

Crear un árbol de directorios alfabético quedando la estructura.
Tal como...

Lo mismo que había:

./LINKS/INFANTIL/
./LINKS/DRAMA/
./LINKS/SCIFI/
./LINKS/SCIFI/FANTASTICA/
./LINKS/SCIFI/ESPACIO/
./LINKS/ACCION/
./LINKS/SCIFI/
./LINKS/COMEDIA/

más:

/LINKS/ALFABETICO/
/LINKS/ALFABETICO/---OTROS
/LINKS/ALFABETICO/0-9
/LINKS/ALFABETICO/A
/LINKS/ALFABETICO/B
/LINKS/ALFABETICO/C
/LINKS/ALFABETICO/D
/LINKS/ALFABETICO/E
...
ETC.

Sería perfecto que se creara una letra por cada letra encontrada en la lista de pelis pues seguro que hay pocas o ninguna que empieze con 'Ñ' o con 'W' :)
y que otras muchas empiezen con 'La ...' o 'El ...'. Cosa que también podría mejorarse añadiendo un enlace doble, por ejemplo:

/LINKS/ALFABETICO/E/El Proyecto Andromeda [SCIFI+FANTASTICA].avi
/LINKS/ALFABETICO/P/Proyecto Andromeda, El [SCIFI+FANTASTICA].avi     <--------¿Complicado?

/LINKS/ALFABETICO/P/El Proyecto Andromeda [SCIFI+FANTASTICA].avi     <--------Con esto ya estaría muy bien.

*****Y por último:

Colocar como sería lógico un link de la película dentro de ese subdirectorio.

Después se comparte con Samba la carpeta LINKS y Wala!!!!! Mi problema de pelis ( y supongo que el de mucha gente) solucionado.

Luego no tendría más que añadir una entrada al cron para que por ejemplo una vez por semana me actualice la lista de links.

Consideraciones especiales:

***** Las pelis que todavía no están catalogadas se colocan en la carpeta:

./PELIS-NUEVAS/

También crearía un link en la carpeta

./PELICULAS/000-NUEVAS/

tal como:

$ ln $PWD/PELIS-NUEVAS ./PELICULAS/000-NUEVAS/

**** Seguro que hay pelis por ahí perdidas que no están catalogadas, en ese caso. Se podrían colocar en la carpeta:

./PELICULAS/000-NO-CATALOGADAS/

**** Y un último problema que tengo que resolver, la codificación de los archivos tales como:

FICHEROS/Depredador [SCIFI+FANTASTICA] [ACCION]/Depredador. Ed. Definitiva EXTRAS/El dise??o de los personajes.avi

Problemas que vienen derivados de copiar pelis previamente ordenadas con coficación para Windows.
Pues yo estoy codificando como:

Y también de que en Linux los caracteres especiales cuentan por dos (como has dicho anteriormente)

$ locale -a | grep 'es_ES'
es_ES.utf8

Y Windows con : ISO, claro

El problema es que tanto puedo ver las carpetas compartidas con Windows que con Linux (la última que utilizo Ubuntu 11.04 lo lee bien)
Arreglo estos problemas tal y como van saliendo con programas como por ejemplo:
Advanced renamer ejecutado con Wine mediante el cual substituyo los diferentes caracteres por sus homónimos sin puntuación mediante una "macro":

ñ ç ----> n c
á é í ó ú ----> a e i o u
à è ì ò ù ----> a e i o u
ä ë ï ö ü ----> a e i o u

Y en eso estamos.............

Ahhh.
Alguna cosilla importante:

para que se puedan compartir mediante samba los enlaces simbólicos hay que añadir los siguientes datos al fichero:

/etc/samba/smb.conf

[global]
unix extensions=no
etc...

[PELICULAS]
wide links=yes
etc...

Y lo que yo hago para borrar SOLAMENTE los links y no TODAS las pelis!!!!!!!!!!!!!
(aunque no se borran los enlaces duros. YO NO ME FIO)

localizo los links:
$ for i in `find $PWD -type l` ; do ls -l $i ; done > borrar-links

y los borro:
$ xargs -n 1 unlink < cat borrar-links | awk '{print $8}'

+1
0
-1
Imagen de santi2808
+1
0
-1

Aquí está el código para crear los links:

Seguro que puede mejorarse, está hecho de una manera muy sencilla (a la vieja usanza).

#! /bin/bash


if [ -f listado ] ; then
	numerodepelis=$(cat listado | wc -l)
	echo "El fichero listado existe y contiene: $numerodepelis peliculas"
else
	echo "El fichero listado no existe, has de ejecutar primero el scrip ./CreaDirectorio"
	exit 1
fi

#para comprobar salida creamos archivo ln.txt
rm ln.txt


while read line
do 
	echo -e "$line"
	#sacamos la ruta de donde se encuentra el archivo:
		rutaorigen=$(expr "$line" : '\(.........\)')
		echo "          rutaorigen: $rutaorigen"
	#sacamos el nombre completo, sin ruta
		nombrefichero=${line:9}
		echo "       nombrefichero: $nombrefichero"
	#contamos cuantas veces esta catalogado (contamos el numero de '[')
			# tr sustituye lo que no sea [ por espacios
			# sed quitar los espacios en blanco
			# wc cuenta la cantidad de [ que quedan que seran la cantidad de generos que hay en la peli
		numerodegeneros=$(echo $line | tr -c '\[' ' ' | sed 's/ //g' | wc -c )
		echo "   Numero de generos: $numerodegeneros"
	NUM=0
	#cambiamos el simbolo + que esta entre SCIFI+ESPACIO por / SCIFI/ESPACIO
	lineagenero=$(echo $line | sed 's/+/\//g')
	#pasamos tantas veces como genero hay
	while [ $NUM -lt $numerodegeneros ]; do
		let NUM=$NUM+1
		#tomamos la longitud total de la cadena a tratar
			tamanolineagenero=$(echo ${#lineagenero})
		#calculamos la posicion del primer [
			posicion1genero=$(echo `expr index "$lineagenero" \[`) #1\[`)
		#calculamos la posicion done se encuetra el primer ]
	########PROBLEMA: va hasta el simbolo [, pero si hay un acento o una ñ cuenta como un espacio más.
			posicion2genero=$(echo `expr index "$lineagenero" \]`)
		#tamaño total del genero ejemplo: [DRAMA]=5
			tamanogenero=$(echo `expr $posicion2genero - $posicion1genero - 1`)
		#cortamos primer genero
			generos=$(echo ${lineagenero:$posicion1genero:$tamanogenero})
			echo "            genero $NUM: $generos    =    $rutadestinogeneros $NUM: $rutadestinogeneros"
			rutadestinogeneros=$(echo "./PELICULAS/GENERO/$generos/")
		#cortamos la cadena hasta el segundo genero
			cortargenero=$(echo `expr $posicion2genero + $posicion1genero`)
			lineagenero1=$(echo ${lineagenero:$posicion2genero:$tamanolineagenero})
			lineagenero=$lineagenero1
			#nombreficherofinal=$(echo "$nombrefichero" | sed 's/ /\/g')
			#echo "nombreficherofinal: $nombreficherofinal"
		#ESTO ES LO QUE QUEREMOS EJECUTAR PARA CREAR LOS ENLACES Y AÑADIRLOS DENTRO DE CADA DIRECTORIO CREADO
		#echo "El directorio actual $PWD" >> ln.txt
		echo "ln -s '$PWD/$rutaorigen$nombrefichero' '$rutadestinogeneros$nombrefichero'" >> ln.txt
	done
echo
done < listado
+1
0
-1
Imagen de razaAztk
+1
0
-1

................ O.O'

Demasiada info la que has soltado! mi cerebro está saturado y ni he entendido chido lo que quieres hacer (y como lo quieres hacer), je.

Por qué bash? según yo lo que pretendes son tareas un tanto complejas que deberían ser tratadas con un lenguaje más robusto, pero bueeeee....

A ver, de tu primer problema lo que entiendo es que quieres crear enlaces simbólicos de tus películas ya clasificadas (que cuentan entre su nombre cadenas del tipo [TAG]), cada enlace en la carpeta de nombre TAG correspondiente, no?

Si es eso, he creado un pequeño script donde como primer argumento le pasas el directorio fuente para realizar la búsqueda de películas; y el segundo argumento donde estará almacenado el catalogo (las carpetas TAG con los enlaces simbólicos). Ejemplo de invocarlo:

$ ./tags.sh $HOME/Videos $HOME/catalogo

NOTA: catalogo debe existir.

He aquí el script:

#!/bin/bash

# $1: Source path (movies)
# $2: Symbolic links path

# Only files (not directories, not symbolic links)
# Files like "NAME MOVIE [TAG1] [TAG2] ... [TAGn].ext"
DATA=$(find "$1" -type f -iname "*\[*\]*")

IFS=$'\n' # Set delimiter, newline
for CURRENT_FILE in $DATA
do
    TEMP=$(echo "$CURRENT_FILE" | tr '\.' ' ') # Remove '.'. Split last [*] of .ext
    TEMP2=$(readlink -f "$CURRENT_FILE") # Absolute path

    IFS=$' ' # Set delimiter, blankspace
    for TAG in $TEMP
    do
        if [[ $TAG == \[*\] ]]
        then
            echo "link of movie '$CURRENT_FILE' to $TAG"
            mkdir -p $TAG
            ln -s "$TEMP2" "$2/$TAG/"
        fi
    done
done

Saludos!

+1
0
-1

void hey(int x,int y)
{
if (x && y)
 printf("http://libertadhack.blogspot.com/");
else
 printf("http://libertadpunk.blogspot.com/");
}