#51 Le 23/07/2010, à 00:11
- Grünt
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Pourtant il s'agit d'une usine à gaz : lister des fichiers avec ls dont le pattern est connu, puis générer des nombres, puis trier, puis extraire les noms de fichiers est complétement inutile.
Si l'on part du principe que tous les mp3 sont dans le même dossier, alors effectivement on peut se passer de la commande find (sauf que, explications ci-dessous) et cela peut être remplacé par ceci :
repsource=/my/dir repcible=/my/cible cd $repsource while read do cp "${REPLY}" "${repsource}" || break; done < <(sort -R <(printf "%s\n" *.mp3))
Exact, mais on perd en souplesse (le script ne peut pas être réutilisé avec des sous-dossiers, avec des fichiers non audio..).
d'autre part, exploiter le code retour <> 0 de cp comme déterminant du remplissage du support cible n'a pas de validité. la copie peut retourner un status <> 0 pour erreur de lecture, problème de droit sur le fichier source... je ne dis pas qu'il ne faut pas s'arrêter si cp retourne un status <> 0 (je me contredirai) mais simplement : dire que si le status de cp est <> 0 alors le disque est plein est un raccourci.
et puis tenter la copie est probablement moins rapide que de vérifier la quantité d'espace restante...
Me semble qu'un bon compromis serait de faire ceci:
- lancer la copie,
- si la copie s'arrête, on vérifie l'espace et la taille du fichier courant,
- si c'est plein, on stoppe, sinon (problème de droit, erreur de lecture) on passe au fichier suivant. Sachant que, de toute façon, si le problème est du à un disque HS, la lenteur du script n'est pas dans ce cas le problème le plus grave.
Red flashing lights. I bet they mean something.
Hors ligne
#52 Le 23/07/2010, à 08:15
- obibann
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Je ne connaissais pas "sort -R".
Je testais les commandes sur une Red Hat, ba le gars y connait po cette option
D'où l'utilisation du $RANDOM dans ma solution.
ls | sort -R
sort: invalid option -- R
Try `sort --help' for more information.
A+
Dernière modification par obibann (Le 23/07/2010, à 08:16)
Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p
Hors ligne
#53 Le 23/07/2010, à 09:36
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
ca serait pas mieux de :
- lister les fichiers,
- separer en 2 element la variable :
- la taille
- le nom
- additionner les tailles des fichiers jusqu’à 2go
- ajouter les noms des fichiers à copier dans une variable
- lancer la copie de la variables contenant les fichiers
ca permettrait de calculer tout d'un coup et de ne faire qu'une copie massive.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#54 Le 23/07/2010, à 09:40
- obibann
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
@Hizoka
Bonne idée, mais la copie massive comporte 1 inconvénient : elle est limitée.
L'erreur pouvant intervenir "Argument list too long"
Celà m'arrive parfois au taf, lorsque je veut copier trop de fichier à la fois. En effet, le shell dispose d'un espace mémoire limité pour stocker une commande avec ses paramètres (256Ko je crois).
Donc la copie massive va fonctionner tant qu'il n'y a pas trop de fichiers à copier.
Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p
Hors ligne
#55 Le 23/07/2010, à 10:21
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
je croyais avoir vu 2mo il y a quelques jours justement..., 2 mo ça commence à faire...
au pire on peut le faire en 2 fois...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#56 Le 23/07/2010, à 10:28
- obibann
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
C'est possible que ça soit 2 Mo, je te dit ça de mémoire.
Je ne pense pas que pour une centaine de mp3 ça pose problème, mais on ne sais jamais, surtout si les fichiers ont des noms longs.
Sinon y'a toujours la solution de faire de la copie par paquet de 50
Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p
Hors ligne
#57 Le 23/07/2010, à 11:35
- twocats
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
La copie massive va poser un autre problème : le dernier fichier, celui qui va provoquer l'erreur, sera copié de manière incomplète et risque de faire planter le lecteur mp3. Il faut donc savoir lequel c'est (sur 4 go copiés !) et l'effacer.
La réponse est 42
Hors ligne
#58 Le 23/07/2010, à 13:55
- Totor
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Bonjour,
Celà m'arrive parfois au taf, lorsque je veut copier trop de fichier à la fois. En effet, le shell dispose d'un espace mémoire limité pour stocker une commande avec ses paramètres (256Ko je crois).
je croyais avoir vu 2mo il y a quelques jours justement..., 2 mo ça commence à faire...
et non ...
Pourquoi find peut être nécessaire (mais pas indispensable) : dans le cas où la taille des noms de fichiers mp3 dépasse 128k (cf. http://forum.ubuntu-fr.org/viewtopic.php?id=408294). Si c'est le cas, l'expansion par bash du pattern *.mp3 ne pourra aboutir et find devra être utilisé. (ou bien ls | grep '\.mp3$' mais il y aurait 1 processus inutile)
Exact, mais on perd en souplesse (le script ne peut pas être réutilisé avec des sous-dossiers[...]
c'est pour cela que find était utilisé au début mais mon script est une réponse à celui d'obibann qui a introduit ls sans récursivité.
[...], avec des fichiers non audio..).
non, pas d'accord. Rien ne t'interdit d'ajouter d'autres pattern comme ceci :
printf "%s\n" *.mp3 *.mp4 *.iso
pour la copie massive, j'ai une idée mais je préfère procéder à des tests à mon retour
-- Lucid Lynx --
Hors ligne
#59 Le 23/07/2010, à 14:22
- groskiff1994
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
bravo les gars c'est impressionnant de vous voir plancher en commun sur ce "petit" projet ! ça me donne envie de retourner à la prog !
Recherche activement tutoriels A JOURS pour gimp et Blender.
Ubuntu ne plante pas, il tombe avec panache.
Hors ligne
#60 Le 23/07/2010, à 20:45
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
La copie massive va poser un autre problème : le dernier fichier, celui qui va provoquer l'erreur, sera copié de manière incomplète et risque de faire planter le lecteur mp3. Il faut donc savoir lequel c'est (sur 4 go copiés !) et l'effacer.
bah non, il n'y a plus ce problème vu qu'on vérifie qu'il y a bien la place avant de les copier.
On sait que la clé fait 4go, on chope 4go de mp3 par bloc de 50 par exemple et on les copie à la suite, donc normalement le dernier fichier est complet.
et non ...
c'est 256ko alors ?
pourtant j'ai lu sur un topic (que je ne pourrais retrouver) qu'on était à 2mo...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#61 Le 24/07/2010, à 09:08
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Voila, je testais ce code mais je bloque...
num=1
while read mp3
do
echo "mp3 : $mp3"
# Récupération de la taille du fichier mp3
taille=${mp3%%###*}
echo "taille : $taille"
# calcule de la taille des fichiers mp3
taille_totale=$((${taille_totale} + ${taille}))
echo "taille_totale : $taille_totale"
# Arret de la boucle si la taille des mp3 est dépasse les 4go
(( ${taille_totale} > 100000 )) && break
# recuperation du nom du fichier mp3
nom=${mp3#*###}
echo "nom : $nom"
# ajout du nom du fichier mp3
case ${num} in
[0-4][0-9]) fichiers_1="${fichiers_1} ${nom}" ;;
[5-9][0-9]) fichiers_2="${fichiers_2} ${nom}" ;;
1[0-4][0-9]) fichiers_3="${fichiers_3} ${nom}" ;;
1[5-9][0-9]) fichiers_4="${fichiers_4} ${nom}" ;;
2[0-4][0-9]) fichiers_5="${fichiers_5} ${nom}" ;;
2[5-9][0-9]) fichiers_6="${fichiers_6} ${nom}" ;;
3[0-4][0-9]) fichiers_7="${fichiers_7} ${nom}" ;;
3[5-9][0-9]) fichiers_8="${fichiers_8} ${nom}" ;;
esac
# incrementation du numero du mp3
(( num++ ))
echo "num : $num"
done < <(du -a . | sort -R | egrep "*.mp3$" | sed 's/\t/###/')
[[ -n ${fichiers_1} ]] && echo "Copie de 50 fichiers" ; cp ${fichiers_1} save/
les echo servent juste à debugger
la je bloque impossible de réussir à copier les fichiers depuis la variables...
quand y a des espaces, il déconne, si je remplace les espaces par des \espaces, pas de changement
idem si j'ajoute des \" autour des noms des fichiers...
Dernière modification par Hizoka (Le 24/07/2010, à 09:08)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#62 Le 24/07/2010, à 14:12
- twocats
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Version 0.2 de ma solution :
#!/bin/bash
# Version du logiciel
VERSION="0.2"
# Variables
MP3NAME=0
WARNING=0
# Début du script
[[ "${TERM}" ]] && clear
while getopts :i:o:-: option
do
if [[ "$option" = "-" ]]
then
case $OPTARG in
input ) option=i ;;
output ) option=o ;;
* ) echo "Option $OPTARG inconnue"; exit 1 ;;
esac
fi
case $option in
i ) INPUT="$OPTARG" ;;
o ) OUTPUT="$OPTARG" ;;
* ) echo "Option $OPTARG inconnue"; exit 1 ;;
esac
done
shift $(($OPTIND - 1))
START_JOB=$(date +%s)
FOLDERSIZE=$(df -P "${OUTPUT}" | awk '(NR!=1) {print $4}')
while [[ "${MP3NAME}" && ${WARNING} -lt 5 ]]
do
echo "====================================================================="
# On cherche un mp3 avec une taille inférieure à l'espace disque disponible
MP3NAME=$(find "${INPUT}" -type f -size -${FOLDERSIZE}k -iname \*.mp3 | sort -R | head -1)
echo -e "Copie du fichier "${MP3NAME##*/}" en cours.\nVeuillez patienter..."
# On vérifie que le fichier n'a pas déjà été copié et on copie
if [[ ! -e "${OUTPUT}""${MP3NAME##*/}" ]]
then
cp "${MP3NAME}" "${OUTPUT}"
WARNING=0
echo "Fait."
else
let WARNING++
echo "Le fichier existe déjà."
fi
echo
# Comptabilise la taille restante sur la clé
FOLDERSIZE=$(df -P "${OUTPUT}" | awk '(NR!=1) {print $4}')
echo -e "Espace disque restant : ${FOLDERSIZE}\n"
done
END_JOB=$(date +%s)
echo -e "Durée du traitement : $((END_JOB - START_JOB)) secondes."
echo "On passe les commandes suivantes. Et pas besoin de 'break' !"
Correction d'un bug qui faisait que le script pouvait partir en boucle infinie si tout les fichiers ayant la taille requise étaient déjà copiés.
Le script n'est pas vraiment plus lent que les autres (6m45s33 selon Aldian). Il produit exactement le résultat recherché et offre une syntaxe normée : -i, --input; -o, --output.
De plus il est portable sur n'importe quelle distribution GNU/Linux moderne et s'adapte automatiquement à n'importe quelle taille de clef USB sans avoir besoin d'éditer le script.
La réponse est 42
Hors ligne
#63 Le 24/07/2010, à 21:33
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
bon bah voila, tu l'as ta soluce Aldian
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#64 Le 25/07/2010, à 00:00
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Oh dit donc, j'ai même pas besoin de chronométrer, le script le fait tout seul
Par contre je viens de tester sur ma clé usb de 2GB, et le script s'arrête alors qu'il reste encore 300 Mo de libres .
C'est clair que lorsque j'ai lancé ce sujet, je ne m'attendais pas à ce qu'il provoque autant d'engouement surtout en plein milieu de l'été! Merci à tous
edit: je me suis penché sur le script. Apparemment durant son exécution, le cas "le fichier existe déjà" s'est présenté 5 fois, donc ça s'est arrêté tout seul.
Visiblement, il y a eu dans les diverses solutions proposées diverses manières d'aborder le cas des doublons. Les deux approches consistant en
- soit trier aléatoirement en une seule fois tous les noms de fichiers, puis les copier un par un dans l'ordre du tri en s'arrêtant quand il n'y a plus de place.
- soit tirer au sort un nom de fichier à chaque boucle, vérifier qu'il n'est pas déjà présent, et sinon le copier.
De mon point de vue, si on s'intéresse juste à l'algorithmie, la deuxième solution m'a l'air moins performante, puisqu'à chaque boucle il faut ajouter un test pour vérifier si le fichier n'est pas déjà présent, et que dans ce cas là on perd une boucle, alors que la première solution évite ces problèmes, non? Qu'en pensez vous?:)
Dernière modification par Aldian (Le 25/07/2010, à 00:15)
Hors ligne
#65 Le 25/07/2010, à 09:37
- Hizoka
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
logiquement faire une liste au debut evite en effet les doublons et donc gagne du temps.
perso je vois le truc comme ca.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#66 Le 25/07/2010, à 13:33
- twocats
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Version 0.3 :
#!/bin/bash
# Version du logiciel
VERSION="0.3"
# Variables
PID_OF=$$
MP3NAME=0
# Début du script
[[ "${TERM}" ]] && clear
while getopts :i:o:-: option
do
if [[ "$option" = "-" ]]
then
case $OPTARG in
input ) option=i ;;
output ) option=o ;;
* ) echo "Option $OPTARG inconnue"; exit 1 ;;
esac
fi
case $option in
i ) INPUT="$OPTARG" ;;
o ) OUTPUT="$OPTARG" ;;
* ) echo "Option $OPTARG inconnue"; exit 1 ;;
esac
done
shift $(($OPTIND - 1))
START_JOB=$(date +%s)
# Tests des dépendances
for PROG_REQ in awk cat clear cp date df find grep head mv sort
do
if ! type -p ${PROG_REQ} >/dev/null 2>&1
then
echo -e "Le programme ${PROG_REQ} n'a pas été trouvé. Veuillez vérifier qu'il est bien installé.\nArrêt du programme."
exit 1
fi
done
# Test des droits en écriture
if [[ ! -w "${OUTPUT}" ]]
then
echo -e "Impossible d'écrire dans le répertoire ${OUTPUT}. Veuillez vérifier vos droits.\nArrêt du programme."
exit 1
fi
echo null.file > /tmp/EXCLUDED_FILES_${PID_OF}.log
FOLDERSIZE=$(df -P "${OUTPUT}" | awk '(NR!=1) {print $4}')
while [[ "${MP3NAME}" ]]
do
echo "====================================================================="
# On cherche un mp3 avec une taille inférieure à l'espace disque disponible
MP3NAME=$(find "${INPUT}" -type f -size -${FOLDERSIZE}k -iname \*.mp3 | grep -v "$(cat /tmp/EXCLUDED_FILES_${PID_OF}.log)" | sort -R | head -1)
echo "${MP3NAME}" >> /tmp/EXCLUDED_FILES_${PID_OF}.log
# On vérifie que le fichier n'a pas déjà été copié et on copie
if [[ "${MP3NAME}" ]]
then
echo -e "Copie du fichier "${MP3NAME##*/}" en cours.\nVeuillez patienter..."
cp "${MP3NAME}" "${OUTPUT}"
echo -e "Fait.\n"
# Comptabilise la taille restante sur la clé
FOLDERSIZE=$(df -P "${OUTPUT}" | awk '(NR!=1) {print $4}')
echo -e "Espace disque restant : ${FOLDERSIZE}\n"
fi
done
rm -f /tmp/EXCLUDED_FILES_${PID_OF}.log
END_JOB=$(date +%s)
echo -e "Durée du traitement : $((END_JOB - START_JOB)) secondes."
Ajout :
- Exclusion des doublons automatique.
- Vérification des dépendances.
- Vérification des droits en écriture sur la clef.
À tester !
La réponse est 42
Hors ligne
#67 Le 25/07/2010, à 15:52
- Totor
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Bonjour,
Peux-tu tester ceci :
#!/bin/bash
time {
dirsource="$1"
dirdest="$2"
cd "${dirsource}"
tar cpMf - -T <(
{ read; read -a infos ; maxsize=${infos[3]} ; } < <(df -k "${dirdest}")
#maxsize=4000000
totalsize=0
while read
do
size=( $(du -k --apparent-size "${REPLY}") )
(( (size[0]+totalsize) < maxsize)) && { echo "${REPLY}";((totalsize+=size[0])); }
done < <(find "${dirsource}" -type f -iname "*.avi" -printf "%P\n"|sort -R) ) | tar xPvC "${dirdest}"
}
et indiquer le résultat...
EDIT : je ne garanti pas de meilleurs résultats mais j'ai fait des tests avec des avi (env. 350Mo chacun) sur 4Go. ça a duré un peu plus de 4minutes. mais tout dépend du nombre et de la quantité de fichiers...)
merci
Dernière modification par Totor (Le 25/07/2010, à 15:56)
-- Lucid Lynx --
Hors ligne
#68 Le 25/07/2010, à 17:00
- twocats
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Ça marche avec l'erreur suivante :
time: cannot run {: No such file or directory
Command exited with non-zero status 127
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 1360maxresident)k
0inputs+0outputs (0major+71minor)pagefaults 0swaps
----
./totor: line 16: Erreur de syntaxe près du symbole inattendu « } »
./totor: line 16: `}'
Dernière modification par twocats (Le 25/07/2010, à 17:05)
La réponse est 42
Hors ligne
#69 Le 25/07/2010, à 17:33
- Totor
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
arrrg.., j'ai rajouté le time lors de la rédaction de mon post sans tester
#!/bin/bash
dirsource="$1"
dirdest="$2"
cd "${dirsource}"
tar cpMf - -T <(
{ read; read -a infos ; maxsize=${infos[3]} ; } < <(df -k "${dirdest}")
#maxsize=4000000
totalsize=0
while read
do
size=( $(du -k --apparent-size "${REPLY}") )
(( (size[0]+totalsize) < maxsize)) && { echo "${REPLY}";((totalsize+=size[0])); }
done < <(find "${dirsource}" -type f -iname "*.mp3" -printf "%P\n"|sort -R) ) | tar xPvC "${dirdest}"
EDIT : changement de l'extension avi en mp3
Dernière modification par Totor (Le 25/07/2010, à 17:36)
-- Lucid Lynx --
Hors ligne
#70 Le 25/07/2010, à 18:26
- twocats
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
C'est tout bon.
Une explication de texte me ravirait.
La réponse est 42
Hors ligne
#71 Le 25/07/2010, à 19:48
- Totor
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
L'idée est de procéder à la création des fichiers cibles en "même temps" et non séquentiellement comme avec l'instruction "cp". Pour cela, il faut donc connaître la liste des fichiers à copier avant de réaliser l'action.
La boucle while read[..]sort -R) a donc pour objectif de constituer cette liste.
Ensuite, on pourrait l'exploiter avec xargs mais l'on risque d'avoir le problème de la taille du buffer de la ligne commande.
Certe, l'utilisation de l'option "-L" d'xargs pourrait limiter le nombre de fichiers à copier simultanément (utilisée conjointement avec l'option -t de cp). Sauf que l'instruction "cp" sera chargée en mémoire à chaque fois que les paquets contenant "-L" fichiers seront à copier.
Il faut donc procéder en une seule fois. D'où l'utilisation de tar pour créer une archive avec tar cpMf - -T <(...) puis extraction de cette même archive (donc création des fichiers) avec tar xPvC "${dirdest}"
L'archive n'est pas vraiment créée puisque tout est réalisé en mémoire. Les actions lecture / écriture sont donc limitées.
les options pour la création de l'archive :
c : pour création de l'archive
p : pour conserver les droits
M : pour faire du multivolume (je ne sais pas si elle est utile; je l'ai mis pensant que cela permet de limiter la taille du buffer mémoire donc des données traitées avant extraction)
f : pour indiquer le nom de l'archive. lorsqu'il s'agit de "-", c'est pour la sortie standard
T : la liste des fichiers à mettre dans l'archive se trouve dans le fichier fourni .Dans notre cas, le fichier est temporaire et est fourni par la forme <(commande) (Pour plus de détail, je vous renvoie au § Process Substitution du man bash). L'utilisation de cette option permet de ne pas être confronté au problème des 128k de la taille du buffer de la ligne de commande.
les options pour l'extraction :
x : extraction
P : ne pas conserver le "/" en début de chemin
v : mode verbose
C : se positionne dans le dossier fourni comme base cible d'extraction
Cela dit, j'attends le résultat d'Aldian pour voire si tout cela vaut le coup.
Dernière modification par Totor (Le 25/07/2010, à 19:59)
-- Lucid Lynx --
Hors ligne
#72 Le 25/07/2010, à 21:53
- Postmortem
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Salut !
Je suis le topic et j'ai une 'tite question si je peux me permettre :
à quoi ça sert de mettre 2 "read " ??
read; read -a infos
EDIT : c'est bon, j'ai compris !! Je retire ma question et continue de suivre tout ce que vous faites... Je vais encore me coucher moins con ce soir !
Dernière modification par Postmortem (Le 26/07/2010, à 08:58)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#73 Le 26/07/2010, à 11:22
- Vysserk3
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Une solution à l'arrache en python :
import os,shutil,random
src,dest="/dossier/source","/dossier/destination"
mylist=[os.path.join(src,entry) for entry in os.listdir(src)]
random.shuffle(mylist)
currentsize,maxsize,fini=0,4*1024*1024,False
while not fini:
afile=mylist.pop(0)
currentsize+=os.path.getsize(afile)+(mylist and [os.path.getsize(mylist[0])] or [0])[0]
fini = currentsize>=maxsize or not mylist
shutil.copy(afile,dest)
Hors ligne
#74 Le 26/07/2010, à 11:33
- Pacifick_FR42
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
abonnement
Hors ligne
#75 Le 28/07/2010, à 13:20
- Aldian
Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?
Bon alors j'ai fait quelques chronos. Comme d'habitude, je rappelle que ces chronos n'ont rien de scientifique, ma charge système peut varier d'une fois sur l'autre, et la précision est au mieux à 10% près. Et d'ailleurs aujourd'hui le système était peut être un peu plus lent que d'habitude.
Alors Twocat 0.3 :
# chrono : 1104 secondes (18m24s25)
Avec une charge système qui bouffe un coeur de processeur en permanence. Désolé, mais il doit y avoir une optimisation mal optimisée quelque part.
Totor script du 25/07/2010, à 18:33
# chrono 6m58s96
Vysserk3 :
non testé pour l'instant
Et j'ai ajouté un test témoins pour voir si le système ramait vraiment plus que d'habitude, mais on dirait que non. J'ai fait un petit mix à mon idée de vos diverses solutions dont le chrono devrait s'approcher d'un chrono d'Hizoka, et s'en approche effectivement avec 7m08:
#!/bin/bash
# Début du script
[[ "${TERM}" ]] && clear
while getopts :i:o:-: option
do
if [[ "$option" = "-" ]]
then
case $OPTARG in
input ) option=i ;;
output ) option=o ;;
* ) echo "Option $OPTARG inconnue"; exit 1 ;;
esac
fi
case $option in
i ) INPUT="$OPTARG" ;;
o ) OUTPUT="$OPTARG" ;;
* ) echo "Option $OPTARG inconnue"; exit 1 ;;
esac
done
START_JOB=$(date +%s)
FOLDERSIZE=$(df -P "${OUTPUT}" | awk '(NR!=1) {print $4}')
# boucle lisant les mp3 1 par 1
while read mp3
do
# Taille du fichier de destination
taille=$(du -s "${mp3}" | sed 's/\t.*//')
# Comptabilise la taille totale des fichiers, évite de lister tout le dossier de sortie
taille_totale=$((${taille_totale:-0} + ${taille}))
# verifie que la taille du dossier est inferieur à 4go approximativement à adapter à la bonne taille
# perf 7m08s
if [[ ${taille_totale} -lt ${FOLDERSIZE} ]]
then
# si c'est vrai, on copie le fichier
cp "${mp3}" "${OUTPUT}"
echo "taille totale/restante : ${taille_totale} / ${FOLDERSIZE} - copie en cours : ${mp3}"
else
# on arrête la boucle, ou "exit" pour quitter le script....
break
fi
# envoie du retour de la recherche de mp3 suivit du mélange de ceux ci dans la boucle
done < <(find "${INPUT}" -type f -iname '*.mp3' | sort -R)
END_JOB=$(date +%s)
echo -e "Durée du traitement : $((END_JOB - START_JOB)) secondes."
Non que je fasse un absolu de cette solution, elle est moins optimisée que d'autres, vu qu'elle ne recherche pas forcément le remplissage maximum.
J'ai essayé aussi la solution Totor de rajouter -printf "%P\n" dans le find, mais je n'ai pas trouvé comment il reconstruisait le chemin vers le fichier derrière, donc j'ai essayé de remplacer dans le script "${mp3}" par "${INPUT}/${mp3}", afin que dans l'echo qui dit ce qu'on fait, le chemin d'accès au fichier n'apparaisse pas, mais en fait ça marche la plupart du temps, et de temps en temps ça plante sur un nom de fichier.
Faudra aussi que je regarde s'il est possible de bloquer find pour qu'il n'aille pas dans les sous-dossier, parfois c'est utile, parfois moins, surtout quand l'un deux s'appelle "incomplete" si vous voyez ce que je veux dire
Hors ligne