PDA

Ver la versión completa : [Ayuda] Script con archivos aleatorios



The_Punisher
03/02/2015, 17:43
Buenas gente!

Estoy haciendo un script en linux, y me he atascado en un punto determinado, a ver si alguien me arroja un poco de luz para que siga tirando del hilo.

El caso es que tengo una carpeta, que nos siempre contiene el mismo número de elementos, y quiero ejecutar cada X tiempo de manera aleatoria uno de ellos.

Estos elementos tiene carácteres alfanúmericos.

Lo primero que pense que haría con JS fue en un array y un ramdon con los indices, pero espero, y deseo que exista una manera mas sencilla.

Un saludo!

juanvvc
03/02/2015, 18:18
Lo primero que pense que haría con JS fue en un array y un ramdon con los indices, pero espero, y deseo que exista una manera mas sencilla.

No, es exactamente eso lo que tienes que hacer. Será sencillo o no según cómo lo hagas.

En Bash:



#!/bin/bash
FILES=$( ls -1 )
NUM_FILES=${#FILES }
RANDOM_INDEX=$((RANDOM%NUM_FILES))
RANDOM_FILENAME=${FILES[RANDOM_INDEX]}

echo Number of files: $NUM_FILES
echo Random index: $RANDOM_INDEX
echo Random filename: $RANDOM_FILENAME


Si quieres solo archivos y no directorios, o solo ciertos archivos, modifica la primera línea con el ls como te venga bien

-----Actualizado-----

Ah, mira, qué anormal soy. Mucho más fácil:



ls -1 | shuf -n 1


Dejo lo anterior por si a alguien le mola cómo funciona RANDOM en bash. Lo he tenido que reconsultar, no es que sea muy habitual y no lo recordaba :D

^MiSaTo^
03/02/2015, 18:25
Lo que dices se puede hacer con bash. Así en rápido y en sucio:



#!/bin/bash

SCANDIR=$1
DIRCONTENT=($SCANDIR/*)
RANGE=${#DIRCONTENT[@]}
EXECFILE_INDEX=$(((RANDOM % ${RANGE})+1))
FILE=${DIRCONTENT[${EXECFILE_INDEX}]}

exec $FILE


Cuidado que creo que no estoy teniendo en cuenta que al listar los directorios también te lista "." y "..". Ahora mismo no se si con algo como shopt -s dotglob y shopt -s nullglob podrías apañar algo.
Al script pásale el directorio que quieras escanear y ejecutar el fichero ;) Acabo de hacer una prueba rápida y funciona. Seguramente se pueda hacer más limpio que esto xD

The_Punisher
04/02/2015, 12:56
Muchas gracias a ambos, vamos progresando. Tengo un problema con los espacios :)

Os enseño el cacho del script que me da problemas.




#guardo un solo elemento del directorio

file=$( ls /home/punizor/loquesea | shuf -n 1)

#Muestro por pantalla para comprobar
echo $file

#ejecuto el programa con el archivo asociado
programa $file

El caso es que si file tiene espacios en blanco el programa no los lanza.

Sigo trabajando en ello.

Nathrezim
04/02/2015, 14:22
Muchas gracias a ambos, vamos progresando. Tengo un problema con los espacios :)

Os enseño el cacho del script que me da problemas.




#guardo un solo elemento del directorio

file=$( ls /home/punizor/loquesea | shuf -n 1)

#Muestro por pantalla para comprobar
echo $file

#ejecuto el programa con el archivo asociado
programa $file

El caso es que si file tiene espacios en blanco el programa no los lanza.

Sigo trabajando en ello.

Encierra $file entre comillas dobles (")

The_Punisher
04/02/2015, 14:26
Venía a decir que ya estaba hecho :D

Gracias a todos, hasta la próxima ;)