1 votos

Un script para obtener un archivo aleatorio

Estimados desarrolladores,

Tengo un problema con mi script al pasar de Android 9 a 10 (dispositivos de un Umidigi S3 Pro a un Umidigi F2).

He instalado Bosybox App en el primero y el módulo Busybox Magisk en el segundo.

Ahora el script no funciona porque el comando:

list=(`busybox find "$dirs" -type f -name *.$ext`)

devuelve un array vacío.

Este es el script:

#!/system/bin/sh
echo
if test "$1" = ""; then
     echo "Randomfile script by Uranya <uranya7x@xxx.xxx> v1.4 01.01.2021"
     echo "Usage:"
     echo "sh randomfile.sh <sourcedir> <extension> <destdir>"
     exit 1
fi
dirs=$1
ext=$2
dird=$3'/'
dest=$dird'random'
delim1=""
delim2=""
last='last.txt'
# create filename's array
IFS=$'\n'

list=(`busybox find "$dirs" -type f -name *.$ext`)

# count number of files
num=${#list[@]}
# generate random number in range 1-NUM
let "ran=(${RANDOM} % ${num})+ 1"
echo Random from $num files is $ran
sour=${list[ran]}
sourn=${sour#$dirs}
sourn=${sourn:1:${#sourn}}
date=$(date +"%Y.%m.%d %H:%M")
day=$(date +"%d")
hour=$(date +"%H")
minute=$(date +"%M")
message='---------------------------------------\n'$date' - '$num' >>> '$ran'\n'$delim1$sourn$delim2
if ([ "$day" = "01" ] && [[ "$minute" < "29" ]]) || [ ! -f $dird$last ]; then
    echo >$dird$last $message
else
    sed -i '1i'$message $dird$last
fi
echo $delim1$sourn$delim2
# rename the old file
cp $dest.$ext $dest'_back.'$ext
# copy the file
cat "$sour" >$dest.$ext
echo File copied as $delim1$dest.$ext$delim2

¿Pueden ayudarme a entender por qué ocurre esto y cómo solucionarlo? ¡Muchas gracias por su atención!

0 votos

Habiendo hecho algunas pruebas he encontrado esto: abriendo una terminal con privilegios de Root y ejecutando --- echo find /storage/7BC3-1805/Music/MP3/Abba -type f -name *.mp3 --- devuelve dos cadenas que contienen los nombres de los archivos dentro de esa carpeta, pero al ponerlo en mi script sigue devolviendo un array vacío, así que el problema no está en el acceso a la carpeta, sino en la sintaxis, supongo (el código find está dentro de los backticks) por lo que es como: echo <BT>find.... *.mp3<BT>

0 votos

¿qué shell está ejecutando el script? Android por defecto es mksh (MirBSD korn shell). sólo bash soporta arrays, ponga shebang a algo como #! /data/data/com.termux/files/usr/bin/bash

0 votos

@alecxs ¡Gracias por señalarlo!

1voto

Queridos amigos,

¡después de un par de horas depurando el script, finalmente, he encontrado el error! La línea a utilizar es: list=( find "$dirs" -type f -name "*.$ext" )

es una diferencia muy sutil: ¡el espacio después y antes del paréntesis! (incluso, la palabra busybox es inútil)

¡Curiosamente en la aplicación Busybox (que he tenido en mi S3 Pro) los espacios no son obligatorios, mientras que en el módulo Busybox Magisk esos espacios SON obligatorios!

Estoy usando este script desde hace casi 8 años para tener cada día una música diferente para mi despertar.

Utilizo Tasker para llamarlo justo antes de que suene mi alarma, así que el mismo archivo contiene cada día una canción diferente.

He hecho un cambio también en el índice del array que no empezó por 0

Así que, aquí está el script:

#!/system/bin/sh
echo
if test "$1" = ""; then
    echo "Randomfile script by Uranya <uranya7x@xxx.xxx> v1.5 (26.03.2021)"
    echo "Usage:"
    echo "sh randomfile.sh <sourcedir> <extension> <destdir>"
    exit 1
fi
dirs=$1
ext=$2
dird=$3'/'
dest=$dird'random'
delim1=""
delim2=""
last='last.txt'
# create filename's array
IFS=$'\n'
list=( `find "$dirs" -type f -name "*.$ext"` )
# count number of files
num=${#list[@]}
# generate random number in range 1-NUM
let "ran=(${RANDOM} % ${num})+ 1"
echo Random from $num files is $ran
sour=${list[$ran-1]}
sourn=${sour#$dirs}
sourn=${sourn:1:${#sourn}}
date=$(date +"%Y.%m.%d %H:%M")
day=$(date +"%d")
hour=$(date +"%H")
minute=$(date +"%M")
message='---------------------------------------\n'$date' - '$num' >>> '$ran'\n'$delim1$sourn$delim2
if ([ "$day" = "01" ] && [[ "$minute" < "29" ]]) || [ ! -f $dird$last ]; then
    echo >$dird$last $message
else
    sed -i '1i'$message $dird$last
fi
echo $delim1$sourn$delim2
# rename the old file
cp $dest.$ext $dest'_back.'$ext
# copy the file
cat "$sour" >$dest.$ext
echo File copied as $delim1$dest.$ext

Espero que le sirva a alguien más que le guste despertarse con la música.

¡Paz en todas partes!

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X