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!!!!

Lo que pasa es que para
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!
void hey(int x,int y)
{
if (x && y)
printf("http://libertadhack.blogspot.com/");
else
printf("http://libertadpunk.blogspot.com/");
}
Programa para organizar películas.
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
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:
...
(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:
*****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:
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}'
Codigo para crear los LINKS
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................
................ 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:
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 doneSaludos!
void hey(int x,int y)
{
if (x && y)
printf("http://libertadhack.blogspot.com/");
else
printf("http://libertadpunk.blogspot.com/");
}