Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#51 Le 23/07/2010, à 01:11

Grünt

Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?

Totor a écrit :

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, à 09: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 lol
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, à 09: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, à 10: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

En ligne

#54 Le 23/07/2010, à 10: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, à 11: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

En ligne

#56 Le 23/07/2010, à 11: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 big_smile


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, à 12: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, à 14:55

Totor

Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?

Bonjour,

obibann a écrit :

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).

Hizoka a écrit :

je croyais avoir vu 2mo il y a quelques jours justement..., 2 mo ça commence à faire...

et non ...

Totor a écrit :

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)

ǤƦƯƝƬ a écrit :

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é.

ǤƦƯƝƬ a écrit :

[...], 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, à 15:22

groskiff1994

Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?

bravo les gars big_smile 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, à 21: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.

totor a écrit :

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

En ligne

#61 Le 24/07/2010, à 10: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, à 10:08)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

En ligne

#62 Le 24/07/2010, à 15: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, à 22:33

Hizoka

Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?

bon bah voila, tu l'as ta soluce Aldian smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

En ligne

#64 Le 25/07/2010, à 01: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 yikes

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 tongue.


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 cool


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, à 01:15)

Hors ligne

#65 Le 25/07/2010, à 10: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

En ligne

#66 Le 25/07/2010, à 14: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, à 16: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, à 16:56)


-- Lucid Lynx --

Hors ligne

#68 Le 25/07/2010, à 18: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: `}'

hmm

Dernière modification par twocats (Le 25/07/2010, à 18:05)


La réponse est 42

Hors ligne

#69 Le 25/07/2010, à 18: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 hmm

#!/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, à 18:36)


-- Lucid Lynx --

Hors ligne

#70 Le 25/07/2010, à 19:26

twocats

Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?

C'est tout bon. smile
Une explication de texte me ravirait. big_smile


La réponse est 42

Hors ligne

#71 Le 25/07/2010, à 20: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, à 20:59)


-- Lucid Lynx --

Hors ligne

#72 Le 25/07/2010, à 22: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, à 09:58)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#73 Le 26/07/2010, à 12: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, à 12:33

Pacifick_FR42

Re : [Résolu]Comment sélectionner aléatoirement 4 GB de fichiers mp3?

abonnement wink

Hors ligne

#75 Le 28/07/2010, à 14: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 wink

Hors ligne