Fedora-Fr - Communauté francophone Fedora - Linux

Communauté francophone des utilisateurs de la distribution Linux Fedora.

  

Dernière news : Fedora-Fr aux 15èmes Rencontres Mondiales du Logiciel Libre

#1 01/04/2012 11:52:00

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Sélection aléatoire

Bonjour à tous,

Je voudrais effectuer une sélection aléatoire de fichier et les copier dans un nouveau fichier avec l'arborescence d'origine. De plus il faudrait définir une taille maximale pour l'ensemble des éléments sélectionner.

Par exemple :  de Musique-Artiste 1- Album 1- Chanson 1     
                                                                  - Chanson 2
                                       Artiste 2 - Album 1- Chanson 1                                 

j'obtient : Musique sélectionnée- Artiste 1- Chanson 2 avec la taille de Musique sélectionnée <= à 10 Go

Oui je sais c'est compliqué, c'est pour changer le contenu de baladeur smile

Si vous connaissez un programme ou une commande qui fasse ça je suis preneur roll

Merci

Hors ligne

#2 01/04/2012 12:02:57

theboogymaster
Membre
Lieu : Suisse
Inscription : 07/04/2008
Messages : 594
Site Web

Re : Sélection aléatoire

as tu déjà essayé de le faire par toi même en bash par example ?


Success is to be measured not so much by the position that one has reached in life as by the obstacles which he has overcome.
http://www.tuxgeek.org
rhce-logo.png

Hors ligne

#3 01/04/2012 13:24:29

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Je débute sous Linux/Fedora je n'en suis pas encore a faire mes propres scripts.
D'après ce que j'ai compris il n'y a pas de fonction random avec les commandes de type find.
La solution que j'ai vu qui s'en rapproche le plus serait d'attribuer un nombre a chaque fichier et d'en faire une sélection aléatoire effectivement dans un bash.
Reste le problème de garder l'arborescence d'origine + spécifier la taille totale à sélectionner. Dur hmm

Hors ligne

#4 01/04/2012 13:37:14

WilQu
Membre
Lieu : Île-de-France
Inscription : 16/02/2008
Messages : 615
Site Web

Re : Sélection aléatoire

La commande sort avec l’option -R te permet d’obtenir un classement aléatoire. Par exemple, ls | sort -R te permet de lister les fichiers d’un dossier dans un ordre aléatoire.

Hors ligne

#5 01/04/2012 15:35:49

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Intéressant lorsque je fais :

 find | sort -R 

j'obtient :

./The Who/My Generation- The Very Best Of The Who/18 - Squeeze Box.mp3
./Bruce Springsteen/ The Essential - Bruce Springsteen - /Viva Las Vegas.mp3
./The Killers
./The Beatles/The Beatles - Greatest Hits '62-'70 4CD /Part 2 Disc 1/08.Good Day Sunshine.mp3
./The Beatles/The Beatles - Greatest Hits '62-'70 4CD /Part 2 Disc 1/18.Two Of Us.mp3
./The Beatles/The Beatles - Greatest Hits '62-'70 4CD /Part 1 Disc 2/27.I Need You.mp3
./Bruce Springsteen/ The Essential - Bruce Springsteen - /Code Of Silence [Live].mp3
./Nina Simone/The Very Best of Nina Simone /09 I Want a Little Sugar in My Bowl.mp3
./Tracy Chapman/1988 - Tracy Chapman/Tracy Chapman - 11 - For You.mp3
./Nirvana/Nirvana - Greatest Hits 2CD/Disc 2/17.Son Of A Gun.mp3
./The Beatles/The Beatles - Greatest Hits '62-'70 4CD /Part 1 Disc 1/01.Love Me Do.mp3

J'ai bien les fichiers sortis de façon aléatoire ainsi que leur emplacement.
Il reste donc à limiter la taille de la recherche et à exploiter le résultat.

Il y a bien une option -size dans find mais elle s'applique au fichier trouvé et non à  la recherche en elle même (si je veux trouver tous les fichiers de moins de 50 Mo par exemple)

Ça avance un peu smile

Hors ligne

#6 02/04/2012 17:54:08

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Up tongue

Hors ligne

#7 06/04/2012 19:46:52

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

J'ai réussi à afficher la taille, l'emplacement et les fichier que je veux avec la commande suivante:

du -a ~/Musique/ | sort -R 

ça me donne le résultat:

 6352	/home/guillaume/Musique/Amy Winehouse /Back To Black/05. Back To Black.mp3
9744	/home/guillaume/Musique/Coldplay/Mylo Xyloto (2011)/10 Princess Of China (Feat. Rihanna).m4a
21640	/home/guillaume/Musique/Ayo/Joyful/06. Ayo - Watching You.flac 

Premièrement existe-t-il un moyen de choisir la taille à afficher en Go? Il y a bien une option Human readable mais elle choisit en fonction soit K,G etc.
Deuxièmement le résultat me compte aussi les dossiers :

931504	/home/guillaume/Musique/Queen

Donc comment les supprimer ? J'ai remarqué que dans ce cas les dossier ne se finissent pas par /, c'est peut être exploitable ?
Enfin je compte rediriger le résultat dans un fichier texte et utiliser la commande cut pour séparer la taille, l'emplacement et le nom du fichier en utilisant le séparateur /. Je pourrai facilement séparer la taille par contre le nombre de sous-dossier étant variable je voudrais conserver uniquement le dernier champ : le nom du fichier. Est ce que c'est possible avec cut ??

Voila j'attend vos réponses avec impatience smile

Dernière modification par Homer Dalor (06/04/2012 19:49:24)

Hors ligne

#8 09/04/2012 00:41:40

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Bonsoir à tous,

J'ai réussi à enlever les dossiers manuellement en triant le résultat précédent par taille. Puis j'ai séparé les champs "taille" et "emplacement+fichier" dans deux fichiers distincts.

Maintenant je voudrais créer un programme pour  compter le nombre de fichier que je peux mettre dans 10 Go par exemple.

Voici mon programme:

#include <stdio.h>
#include <stdlib.h>

FILE* fichier = NULL;

int main()
{
int i=1,resultat=0,taille;


fichier = fopen("/home/guillaume/taille","rt");

if (fichier == NULL)
   printf(" Ouverture du fichier impossible ! ") ;
else
    {
    printf("Ouverture du fichier taille");
    while (!feof(fichier)&&(resultat<1000000000))
          {
          fscanf(fichier,"%d",taille);
          resultat=resultat+taille;
          printf("Ligne %d : resultat= %d",i,resultat);
          i++;
          }
    fclose(fichier);
    }

return 0;
}

Ce qui me donne le résultat suivant : sh: pause : commande introuvable.Ouverture du fichier impossible !

L'adresse est correcte si je fais gedit /home/guillaume/taille mon fichier s'ouvre bien. J'ai aussi essayé par adresse relative sans succès.

J'utilise l'IDE anjuta.

Si quelqu'un comprend ce qui ne marche pas qu'il se fasse connaitre smile

Dernière modification par Homer Dalor (09/04/2012 15:01:53)

Hors ligne

#9 09/04/2012 00:54:48

Mongos
openAddict & pinguAddict
Lieu : Palaiseau
Inscription : 25/06/2007
Messages : 748

Re : Sélection aléatoire

Homer Dalor a écrit :

[...]

Premièrement existe-t-il un moyen de choisir la taille à afficher en Go? Il y a bien une option Human readable mais elle choisit en fonction soit K,G etc.

Je ne pense pas, mais ça à la limite ça se converti

Homer Dalor a écrit :

[...]
Deuxièmement le résultat me compte aussi les dossiers :

931504	/home/guillaume/Musique/Queen

Donc comment les supprimer ? J'ai remarqué que dans ce cas les dossier ne se finissent pas par /, c'est peut être exploitable ?
[...]

La commande grep avec l'option E sera ton ami. Un fichier musical fini toujours par .ext où ext est l'extension de ton fichier :

 du -a ~/musiques | grep -E '.*\.[a-zA-Z0-9]*$' | sort -R 

ça devrait ne sélectionner que les fichiers musicaux.

Homer Dalor a écrit :

Enfin je compte rediriger le résultat dans un fichier texte et utiliser la commande cut pour séparer la taille, l'emplacement et le nom du fichier en utilisant le séparateur /. Je pourrai facilement séparer la taille par contre le nombre de sous-dossier étant variable je voudrais conserver uniquement le dernier champ : le nom du fichier. Est ce que c'est possible avec cut ??

Voila j'attend vos réponses avec impatience smile

Avec cut je ne sais pas, mais avec sed oui

sed 's/\([^ /]*\) *\(\/.*\/\)\(.*\..*\)/Taille : \1 \tDossier : \2 \tFichier : \3/'

Ça parait illisible comme ça, mais avec un peu d'habitudes, les expressions régulières c'est un bonheur :D

Dernière modification par Mongos (09/04/2012 01:10:12)


Il n'y a pas de problème, juste des solutions

Hors ligne

#10 09/04/2012 08:29:20

nouvo09
Accro à Fedo !
Lieu : Paris
Inscription : 22/09/2005
Messages : 17 627

Re : Sélection aléatoire

Homer Dalor a écrit :

La solution que j'ai vu qui s'en rapproche le plus serait d'attribuer un nombre a chaque fichier et d'en faire une sélection aléatoire effectivement dans un bash.

Chaque fichier est défini par son numéro d'inode. Ca te convient mieux ?


C'est pas parce que c'est difficile qu'on n'ose pas,
c'est parce qu'on ose pas que c'est difficile !

Hors ligne

#11 09/04/2012 11:14:26

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

La commande grep avec l'option E sera ton ami. Un fichier musical fini toujours par .ext où ext est l'extension de ton fichier :

Merci ça marche nickel smile

Avec cut je ne sais pas, mais avec sed oui

sed 's/\([^ /]*\) *\(\/.*\/\)\(.*\..*\)/Taille : \1 \tDossier : \2 \tFichier : \3/'

C'est pas mal par contre ce que je voudrais c'est avoir que deux champs: "taille" et "emplacement+fichier" car en fait ce que je vais faire c'est copier mon dossier Musique puis supprimer tout les fichiers que j'ai en trop pour avoir finalement la taille voulue. A mon avis c'est  plus simple que de répéter l'action copier un fichier et créer un dossier s'il n'existe pas à chaque fois. Et oui les expressions régulières c'est velu, je me pencherai dessus plus tard roll

Chaque fichier est défini par son numéro d'inode. Ca te convient mieux ?

C'est sans doute exploitable mais la commande sort -R me fait déjà ça très bien mais merci quand même smile

Hors ligne

#12 09/04/2012 14:13:12

Mongos
openAddict & pinguAddict
Lieu : Palaiseau
Inscription : 25/06/2007
Messages : 748

Re : Sélection aléatoire

Homer Dalor a écrit :

...
C'est pas mal par contre ce que je voudrais c'est avoir que deux champs: "taille" et "emplacement+fichier" car en fait ce que je vais faire c'est copier mon dossier Musique puis supprimer tout les fichiers que j'ai en trop pour avoir finalement la taille voulue. A mon avis c'est  plus simple que de répéter l'action copier un fichier et créer un dossier s'il n'existe pas à chaque fois. Et oui les expressions régulières c'est velu, je me pencherai dessus plus tard roll
...

Ah au temps pour moi, je croyais que tu voulais le dossier et le fichier séparé ^^

Dans ce cas c'est plus simple :

sed 's/\([^ /]*\) *\(.*\)/Taille : \1 \tFichier : \2

Je pense que le plus simple serait de garder les tailles affiché de base (en octets il me semble), tu récupères la première partie, avec cette partie tu incrèmentes un compteur, si le compteur est inférieur à une certaine valeur (10G par ex) tu copies la seconde partie :)


Il n'y a pas de problème, juste des solutions

Hors ligne

#13 09/04/2012 14:59:44

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Je pense que le plus simple serait de garder les tailles affiché de base (en octets il me semble), tu récupères la première partie, avec cette partie tu incrèmentes un compteur, si le compteur est inférieur à une certaine valeur (10G par ex) tu copies la seconde partie :)

Oui je pense que c'est ce que je fais.
En tout cas mon programme marche bien mais il tourne uniquement sous Windows ....
Je comprend pas pourquoi il ne veut pas ouvrir mon fichier sous Linux hmm
Sinon j'ai réussi à faire ce que je voulais c'est le principal big_smile

Merci à ceux qui ont pris la peine de m'aider wink

(PS : J'attend un peu avant de de déclarer le sujet résolu car mon programme ne fonctionne pas sous Linux)

Hors ligne

#14 12/05/2012 23:43:19

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Bonsoir tout le monde alors voilà mon nouveau problème (décidément !  roll)  :

J'ai commencé à écrire un script bash pour réaliser cette sélection aléatoire.

Je n'arrive pas à  obtenir uniquement l'adresse d'un fichier, lorsque je fais :

[guillaume@guillaume-desktop Musique]$ find -type f 
./Ben Harper/Both Sides of the Gun/Both Sides of the Gun Disc 1/07 More Than Sorry.mp3
./Ben Harper/Both Sides of the Gun/Both Sides of the Gun Disc 1/02 Waiting for You.mp3
./Ben Harper/Both Sides of the Gun/Both Sides of the Gun Disc 1/09 Happy Everafter in Your Eyes.mp3
./Ben Harper/Both Sides of the Gun/Both Sides of the Gun Disc 1/08 Cryin' Won't Help You Now.mp3
./The Gladiators/Dreadlocks The Time Is Now /12 - Get Ready.flac
./The Gladiators/Dreadlocks The Time Is Now /03 - Looks Is Deceiving.flac
./The Gladiators/Dreadlocks The Time Is Now /15 - Naturality.flac
./The Gladiators/Dreadlocks The Time Is Now /02 - Bellyfull.flac

J'ai pensé à utiliser sed mais je n'y arrive pas, les expressions régulière je maîtrise pas sad

Merci pour vos réponses.

Hors ligne

#15 13/05/2012 10:04:38

Roultabie
Le jour ou FC11 a changé ma vie
Inscription : 11/06/2009
Messages : 265

Re : Sélection aléatoire

Homer Dalor a écrit :

Je n'arrive pas à  obtenir uniquement l'adresse d'un fichier, lorsque je fais :

L'adresse d'un fichier ...

Tu veux dire l'emplacement (je ne me souviens plus du nom adéquat).

Car si c'est le cas, tu sais dans quel répertoire tu te trouve avec pwd.

SI j'ai bien compris.


Config: Asus U53SD, Intel Core i5-2410M, DDR3 4G, NVIDIA GeForce GT520M, Fedora 16 x86_64 Archlinux, Optimus avec Bumblebee.

Hors ligne

#16 13/05/2012 14:30:01

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Roultabie a écrit :

Tu veux dire l'emplacement (je ne me souviens plus du nom adéquat).

Oui je voulais bien dire son emplacement


Roultabie a écrit :

Car si c'est le cas, tu sais dans quel répertoire tu te trouve avec pwd.

La commande pwd indique l'emplacement du dossier en cours. Autrement dit depuis où  la commande est exécutée.

Je ne pense pas qu'on puisse se servir de pwd pour récupérer l'emplacement d'un fichier ou d'un dossier.

Merci quand même sad

Hors ligne

#17 13/05/2012 14:40:51

Pikachu_2014
Modérateur
Modérateur
Lieu : Boulogne-Billancourt
Inscription : 16/06/2005
Messages : 11 334
Site Web

Re : Sélection aléatoire

Poste ton script, on pourra te guider ainsi.


« …elle excitait si puissamment le désir, que je devins alors très incrédule sur sa vertu. »
À propos de Fœdora, dans la Peau de Chagrin (Balzac) roll

Hors ligne

#18 13/05/2012 18:06:48

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

#!/bin/bash

#Création du dossier Musique_choisie et des sous répertoires (NB: le script doit être executé depuis /Musique

 find -type d -exec mkdir -p /home/guillaume/Musique_choisie/{} \;

#Demande le nombre de GB à transférer

read -p 'Entrez le nombre de GB : ' taille

#Copie des fichiers

let "taille_dossier = `du -s  ~/Musique_choisie/ | cut -d / -f 1`" 
let "taille = taille * 1073741824 "

while [$taille_dossier -lt $taille]
do
	
done

#Suppression des dossiers vides 

find ~/Musique_choisie/ -empty -delete

J'aimerais dans la boucle while faire quelque chose comme :

for fichier in `find -type f | sort -R`
do
            emplacement=`??`

            cp $fichier ~/Musique_choisie/emplacement
         
done

voilà j'espère que c'est plus clair maintenant wink

Hors ligne

#19 16/05/2012 22:58:07

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Up tongue

Hors ligne

#20 21/05/2012 23:02:01

Homer Dalor
Membre
Inscription : 01/04/2012
Messages : 13

Re : Sélection aléatoire

Up encore wink

Hors ligne

Pied de page des forums