seleccion de archivos de manera aleatoria en bash???

Pablo Salinas Rivera psalinasrivera en gmail.com
Lun Dic 12 03:51:37 CLST 2005


Carlos Moyano Cubillos wrote:
> 2005/12/11, German Poo Caaman~o <gpoo en ubiobio.cl>:
>>El dom, 11-12-2005 a las 12:03 -0500, Jesus Aneiros Sosa escribió:
>>>On Sat, 10 Dec 2005, Carlos Moyano Cubillos wrote:
>>>>ls -RQ /mnt/respaldo/musica | grep .mp3
> esto me da buen resultado, todos los mp3 contenidos en el directorio
> musica y sus subdirectorios.
>>>Creo que mas preciso seria
>>>
>>>ls -RQ /mnt/respaldo/musica | grep '.mp3$'
> esto no me da ni una salida a pantalla, la verdad no se que quiere
> decir el signo peso ahi.

mostrara solo las palabras _que terminen_ con el string mp3.. y no te entrega 
nada porque tus string estan terminando con «.mp3"» (con comilla) y no con «.mp3»

>>Si hemos de ser precisos, entonces debiera ser:
>>
>>ls -RQ /mnt/respaldo/musica | grep '\.mp3$'
>>
>>Dado que '.' para grep significa cualquier caracter; lo
>>cual también podría ser un directorio llamado
>>'charlas-mp3' o afín :-)
 >
> eso tampoco me da una salida a pantalla...

lo mismo de arriba...

> otra cosa...
> 
> lo que necesito es la direccion y nombre de todos los mp3 en las
> directorios y sus subdirectorios, es decir, ruta completa.
> 
> ls -RQ me da solo el nombre, lo bueno de esto es que me los da entre comillas.
> 
> como podria obtener ruta completa de los mp3s pero entre comillas?

si, se puede, voy a intentarlo con un ejemplo a ver si me resulta, y cuando 
tenga un reproductor mp3 talvez lo ocupe tambien ;) En el directorio actual 
hago un find y obtengo:

$ find .
.
./01_Aconcagua.mp3
./Los Jaivas - Mamalluca
./Los Jaivas - Mamalluca/10 Mamalluca.MP3
./Los Jaivas - Mamalluca/09 Elqui.MP3
./Los Jaivas - Mamalluca/portada.jpg
./Los Jaivas - Mamalluca/01 Alumno.MP3
./Los Jaivas - Mamalluca/02 Uva Madura.MP3
./Los Jaivas - Mamalluca/03 Chaski.MP3
./Los Jaivas - Mamalluca/04 El Tambo.MP3
./Los Jaivas - Mamalluca/05 Camino Estrellado.MP3
./Los Jaivas - Mamalluca/06 Cerro De La Virgen.MP3
./Los Jaivas - Mamalluca/07 Gabriela.MP3
./Los Jaivas - Mamalluca/08 Interludio.MP3
./01 Pregon para iluminarse.mp3
./02 La poderosa muerte.mp3
./03 Cancion para los pajaros.mp3
./05 Un dia en tus dias.mp3
./07 Corre que te pillo.mp3

tengo archivos con mp3 (minusculas) y MP3 (mayusculas), hay archivos con 
espacios en el nombre, y hay un archivo "no-mp3" (portada.jpg).

primero filtramos solo los archivos mp3 y agregamos comillas :

$ find . -type f | grep "\.[mM][pP]3$" | sed -e 's/.*/"&"/'
"./01_Aconcagua.mp3"
"./Los Jaivas - Mamalluca/10 Mamalluca.MP3"
"./Los Jaivas - Mamalluca/09 Elqui.MP3"
"./Los Jaivas - Mamalluca/01 Alumno.MP3"
... ETC....

son 16 archivos mp3, ahora la idea es meter esto a una lista.. pero el 
espacio no serviria como delimitador, ocupamos el asterisco como delimitador, 
ya que no se puede ocupar en nombres de archivos..

$ find .  -type f  | grep "\.[mM][pP]3$" |  sed -e 's/.*/"&"/' | \
     awk 'BEGIN{ORS="*"}{print}END{print NR}'

ORS le dice a awk cual sera el separador de registro (por defecto es un salto 
de linea, aca sera el *). y con print NR imprime al final de la lista el 
tamaño, (numero de archivos).

eso dejara todo _en una sola linea_, algo asi:

"./01_Aconcagua.mp3"*"./Los Jaivas - Mamalluca/10 Mamalluca.MP3"*"./Los 
Jaivas - Mamalluca/09 Elqui.MP3"*.... etc etc...  *16*

la sentencia anterior se asigna a la variable

LISTA=$(find . -type.... etc.. )

obtenemos el tamaño de la lista.. que quedo al final de la linea..

TAM_LISTA=$(echo $LISTA | awk 'BEGIN{FS="*"}{print $(NF-1)}')

y finalmente hacemos un ciclo hasta NN=(n° de archivos a seleccionar)

for i in {1..NN} ; do
	#a awk no le sirve el num==0, imprimiria la lista completa
	num=$[RANDOM*$[TAM_LISTA-1]/32767 + 1]
	echo $LISTA | awk 'BEGIN{FS="*"}{print $'$num'}'
done

se podria modificar la ultima linea para que cree el comando de copia al 
pendrive:

echo $LISTA | awk 'BEGIN{FS="*"}{print "cp -f "$'$num'" /mnt/pendrive/"}'

mm, parece que funciona..
-- 
pablo salinas rivera
usuario linux #221909 (http://counter.li.org)


Más información sobre la lista de distribución Linux