1 votes

Un script pour obtenir un fichier aléatoire

Chers développeurs,

J'ai un problème avec mon script qui passe d'Android 9 à 10 (appareils d'un Umidigi S3 Pro à un Umidigi F2).

J'ai installé Bosybox App sur le premier et Busybox Magisk module sur le second.

Maintenant le script ne fonctionne pas car la commande :

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

renvoie un tableau vide.

C'est le script complet :

#!/system/bin/sh
echo
if test "$1" = ""; then
     echo "Randomfile script by Uranya <@uranya7x> 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

Pouvez-vous m'aider à comprendre pourquoi cela se produit, et comment y remédier ? Merci beaucoup pour votre attention !

0 votes

Après avoir fait quelques tests, j'ai trouvé ceci : ouvrir un terminal privilégié Root et exécuter --- echo find /storage/7BC3-1805/Music/MP3/Abba -type f -name *.mp3 --- il renvoie deux chaînes contenant les noms des fichiers à l'intérieur de ce dossier, mais en le mettant dans mon script, il continue à retourner un tableau vide, donc le problème n'est pas dans l'accès au dossier, mais dans la syntaxe, je suppose (le code find est à l'intérieur de backticks) donc c'est comme : echo <BT>find..... *.mp3<BT>

0 votes

Quel shell exécutez-vous le script ? Android par défaut est mksh (MirBSD korn shell). seul bash supporte les tableaux, définissez shebang à quelque chose comme #!/data/data/com.termux/files/usr/bin/bash

0 votes

@alecxs Merci de l'avoir signalé !

1voto

Chris Points 11

Chers amis,

Après quelques heures de débogage du script, j'ai enfin trouvé l'erreur ! La ligne à utiliser est : list=( find "$dirs" -type f -name "*.$ext" )

il s'agit d'une différence très subtile : l'espace après et avant la parenthèse ! (même, le mot busybox est inutile)

Bizarrement dans l'application Busybox (que j'ai eu sur mon S3 Pro) les espaces ne sont pas obligatoires, alors que dans le module Busybox Magisk ces espaces SONT obligatoires !

J'utilise ce script depuis presque 8 ans pour avoir une musique différente chaque jour pour mon réveil.

J'utilise Tasker pour l'appeler juste avant que mon alarme ne se déclenche, donc le même fichier contient chaque jour, une chanson différente.

J'ai également modifié l'index du tableau qui n'a pas commencé par 0.

Donc, voici le bon script :

#!/system/bin/sh
echo
if test "$1" = ""; then
    echo "Randomfile script by Uranya <@uranya7x> 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

J'espère qu'il sera utile à quelqu'un d'autre qui aime être réveillé par la musique.

La paix partout !

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X