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.

#1 Le 27/07/2014, à 16:30

Flying-Fish

[Résolu] Répartir les fichiers aléatoirement dans des dossiers

Salut à tous,

J'ai pas mal de fichiers musicaux et j'aimerais pouvoir les répartir aléatoirement dans des dossiers de taille fixe de 1Go (de telle sorte qu'un fichier ne puisse pas être copié dans 2 dossiers différents).

Par exemple :

Dossier001 (1Go) :

- Fichiers 001, 005, 013, 042...

Dossier002 (1Go également) :

- Fichiers 003, 006, 008, 075...

Etc...

Par avance merci pour votre aide.

Dernière modification par Flying-Fish (Le 21/03/2015, à 12:10)


Dell Latitude 5480
Mint Xfce
5.15.0-84-generic x86_64
Xfce 4.18.1

Hors ligne

#2 Le 27/07/2014, à 16:54

Kooothor

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

Salut,

Comme je le vois, tu pourrais faire un script du genre :

- mkdir premier dossier
- mv premier fichier dans le dossier
- check la taille du dossier
- check la taille du prochain fichier
- si le prochain fichier rentre pas dans le dossier (taille totale < 1Go)
- mkdir deuxième dossier
-mv deuxième fichier dans le deuxième dossier
- sinon, mv deuxième fichier dans premier dossier

et ainsi de suite smile

Sinon, tu pourrais expliquer pourquoi tu souhaites faire ça ??

Parce que sinon tu peux aussi créer plein d'archives rar de 1 Go exactement.

Hors ligne

#3 Le 27/07/2014, à 17:02

Flying-Fish

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

Hello,

En fait, j'ai bien un script (trouvé me semble-t-il dans ce sujet) pour remplir mon baladeur MP3 de fichiers aléatoirement. Le seul problème c'est que j'ai l'impression que certains fichiers reviennent beaucoup plus souvent que d'autres et j'en ai marre d'entendre toujours les mêmes chansons.

Ou alors il faudrait adapter le script évoqué précédemment pour qu'il déplace les fichiers déjà copiés au moins une fois sur le baladeur vers un dossier "Déjàécoutés" ou quelque chose du genre...

Dernière modification par Flying-Fish (Le 27/07/2014, à 17:03)


Dell Latitude 5480
Mint Xfce
5.15.0-84-generic x86_64
Xfce 4.18.1

Hors ligne

#4 Le 29/07/2014, à 07:48

Flying-Fish

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

Personne ?


Dell Latitude 5480
Mint Xfce
5.15.0-84-generic x86_64
Xfce 4.18.1

Hors ligne

#5 Le 29/07/2014, à 08:59

pingouinux

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

Bonjour,
Tu peux essayer ce script correspondant à ta demande en #1. Il y a 2 lignes à adapter à ton cas (marquées # À adapter).

Avec ce script, les dossiers créés s'appelleront /tmp/tst/Dossier001, /tmp/tst/Dossier002, …, et le fichier /tmp/liste_des_fichiers contient la liste des fichiers à copier (chemin complet, 1 par ligne).

On passe au dossier suivant dès que l'ajout d'un fichier fait dépasser la taille max, sauf si le dossier est vide. Dans ce cas, même si le fichier est très gros, on le copie quand même.

Quand on est passé à un nouveau dossier, on ne cherche pas à remplir les dossiers précédents si on rencontre un petit fichier.

#!/bin/bash

Dossier=/tmp/tst/Dossier # À adapter
taille_max=1000000000
n=0
taille_dossier=0
while read fic
do
   taille_fic=$(stat -c %s "$fic")
   if (( taille_dossier==0 || taille_dossier+taille_fic>taille_max ))
   then
      ((++n))
      dossier="$Dossier"$(printf "%03d" $n)
      mkdir -p "$dossier"
      taille_dossier=0
   fi
   ((taille_dossier+=taille_fic))
   cp -pi "$fic" "$dossier"
done < <(sort -R /tmp/liste_des_fichiers) # À adapter

Édité : Le script suppose que les dossiers sont vides au départ. Si tu relances le script avec une autre liste de fichiers et les mêmes noms de dossiers, il écrira à nouveau dans les dossiers qui étaient déjà au max.

Édité(2) : Correction d'une erreur

Dernière modification par pingouinux (Le 29/07/2014, à 17:24)

Hors ligne

#6 Le 29/07/2014, à 17:02

Flying-Fish

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

Hey, merci beaucoup Pingouinux, j'vais essayer ça de suite !

Au pasage, le script que j'avais pour mon baladeur, c'était le suivant (trouvé ici même sur le forum) :

#!/bin/bash

######################################################
# Script de copie aléatoire de musique sur baladeur  #
#                                                    #
#Écrit par lylambda, et capkurt inspiré par stefP    #
# Version 8                                          #
# http://forum.ubuntu-fr.org/viewtopic.php?id=200739 #
######################################################

# Définir le répertoire d'origine
# /!\ À modifier selon le baladeur
rep_dest="mtp://[usb:003,005]/Storage%20Media/Singles"
# Définir le répertoire d'origine
# /!\ À modifier selon l'emplacement de la bibliothèque musicale
rep_orig="/media/fish/FishData/Fish/Musique"
# Décommenter la ligne suivante pour utiliser le mode debug en terminal
#dbg=yes

#############################
### ASSISTANT EN MODE GUI ###
#############################
Control_init() {
[ $dbg ] && echo "(A) : Vérification par l'utilisateur des dossiers à utiliser" 
zenity --question --width=400 --height=200 --title="Copie Aléa de mp3" --text="Vérifier les informations ci-dessous: \n\n Repertoire de destination: \n$rep_dest \n\n Cette information est-elle correcte?" 
if [ $? = 0 ]
	then
		[ $dbg ] && echo "      Le répertoire de destination est correcte; aucun changement"
	else
		# Ouverture de la fenêtre pour choisir le répertoire de destination
		rep_dest=$(zenity --file-selection --directory --title="Choix du répertoire de destination" --filename $rep_dest )
		[ $dbg ] && echo "      Les répertoires doivent être redéfini"
fi
zenity --question --width=400 --height=200 --title="Copie Aléa de mp3" --text="Vérifier les informations ci-dessous: \n\n Repertoire d'origine: \n$rep_orig \n \n Cette informations est-elle correcte?" 
if [ $? = 0 ]
	then
		[ $dbg ] && echo "      Le répertoire d'origine est correcte; aucun changement"
	else
		# Ouverture de la fenêtre pour choisir le répertoire d'origine 		
		rep_dest=$(zenity --file-selection --directory --title="Choix du répertoire d'origine" --filename $rep_orig )
		[ $dbg ] && echo "      Les répertoires doivent être redéfini"
fi
}

Dell_rep_dist_GUI() {
if [ ! $(ls $rep_dest/|wc -l) = 0 ]
then 
	[ $dbg ] && echo "(B) : Le répertoire de destination n'est pas vide"
	dell_rep_dist=$(zenity --question --width=400 --height=200 --title="Copie Aléa de mp3" --text="Voulez-vous supprimer le contenu du repertoire de destination :\n\n $rep_dest " )
	if [ $? = 0 ]
		then
		# Vider le répertoire de destination
		rm -r ${rep_dest}/*
		[ $dbg ] && echo "      Le contenu du répertoire de destination est supprimé"
	else
		[ $dbg ] && echo "      Le contenu du répertoire de destination ne sera supprimé"	
	fi
fi

}

GetModel_GUI() {
model=$(zenity --list --radiolist --width=400 --height=200 --title="Copie Aléa de mp3" --text="Choisissez le type de copie :\n" --column="" --column="" \
FALSE "Utiliser un nombre d'occurence" \
FALSE "Utiliser la taille maximum du média" \
FALSE "Utiliser une taille de selection" )
# Quitter si aucune sélection
if [[ -z ${model} ]]; then
	exit 1
elif [[ $model == "Utiliser un nombre d'occurence" ]] ; then
	occurence=$(zenity --entry --width=400 --height=200 --title="Copie Aléa de mp3" --text="Entrez le nombre d'occurence :\n")
	occurence=$((${occurence}-1))
elif [[ $model == "Utiliser une taille de selection" ]] ; then
	taille_dispo=$(zenity --entry --width=400 --height=200 --title="Copie Aléa de mp3" --text="Entrez la taille de musique a copier :\nLa Taille est en Mio \n")
	taille_dispo=$((${taille_dispo}*1000))
fi
}
CP_MP3 () {

if [[ -d ${rep_dest} && -d ${rep_orig} ]]; then

if [[ ! $model == "Utiliser une taille de selection" ]] ; then
	# Définir la taille disponible sur le répertoire de destination
	taille_dispo=`df ${rep_dest} | awk '{print $4}' | head -2 | tail -1`
	[ $dbg ] && echo "(C) : Taille disponible : ${taille_dispo}"
fi

# Lancement de la fenêtre de chargement
zenity --progress --width=400 --height=200 --pulsate --auto-close &
zpid=$!

find -L ${rep_orig} -type f \( -iname "*.mp3" -o -iname "*.ogg" -o -iname "*.wma" \) | sort -R | sed -e "s#${rep_orig}/##g" > ${rep_orig}/list_music
    # Si le répertoire d'origine contient de la musique
    if test -s ${rep_orig}/list_music; then
        [ $dbg ] && echo "(D) : Création de la liste des morceaux disponibles"
        # Initialiser le compteur de morceaux à copier
        nbr_copie=0
      	taille_dispo_init=${taille_dispo}
        # Lancer la boucle définissant les morceaux à copier pour remplir le répertoire de destination
        while true; do
            # Sélectionner un morceau
            fic_music=`head -n $((${nbr_copie}+1)) ${rep_orig}/list_music | tail -1`
            # Définir la taille du morceau
            taille_music=`du -s "${rep_orig}/${fic_music}"| awk '{print $1}'`
                # Si la taille disponible est strictement inférieur à la taille du morceau :
                if test "${taille_dispo}" -lt "${taille_music}"; then
                    # Créer dans le répertoire d'origine, un nouveau fichier texte listant que les morceaux sélectionnés
                    head -n ${nbr_copie} ${rep_orig}/list_music | sort > ${rep_orig}/select_music
                    [ $dbg ] && echo "(E) : Création de la liste des morceaux sélectionnés"
                    # Quitter la boucle 
                    break 

					elif [ ! -e ${occurence} ] && [ $occurence -lt $nbr_copie ]
					then                    
					# Créer dans le répertoire d'origine, un nouveau fichier texte listant que les morceaux sélectionnés
                    head -n ${nbr_copie} ${rep_orig}/list_music | sort > ${rep_orig}/select_music
                    [ $dbg ] && echo "(E) : Création de la liste des morceaux sélectionnés"
                    # Quitter la boucle 
					break
                fi
            # Sinon actualiser de la taille disponible
            taille_dispo=$((${taille_dispo}-${taille_music}))
            # Incrémenter le compteur de morceaux de 1 
            nbr_copie=$((${nbr_copie}+1))
            [ $dbg ] && echo "${nbr_copie} : Sélection de ${fic_music}" && echo "    Taille prise = ${taille_music} - Taille disponible = ${taille_dispo} - Taille disponible initiale = ${taille_dispo_init}"
	        done 

kill $zpid

		cpt=`cat ${rep_orig}/select_music | wc -l`
		i=0
        IFS=$'\n' 
        for morceau in $(cat ${rep_orig}/select_music); do
			i=$(($i+1))
		    echo $((${i}*100/${cpt}))
            cd ${rep_orig} && cp "${morceau}" "${rep_dest}" && cd
        done | zenity --progress --width=400 --height=200 --percentage=0 --auto-close
        unset IFS 
        # Supprimer les fichiers texte temporaires
        rm ${rep_orig}/list_music
        rm ${rep_orig}/select_music
        [ $dbg ] && echo "(F) : Suppression des fichiers temporaires"
fi
else
zenity --error --text="Une erreur est survenu. Les dossiers des destination et d'origine sont incorrect."
Control_init
Dell_rep_dist_GUI
GetModel_GUI
CP_MP3
fi
}

##############
### SCRIPT ###
##############
Control_init
Dell_rep_dist_GUI
GetModel_GUI
CP_MP3
[ $dbg ] && echo "Fin : vous pouvez quitter le terminal"
exit 0

mais l'idée de le modifier pour qu'il déplace les fichiers déjà copiés sur le baladeur dans un dossier "écoutés" est séduisant (mais j'sais pas faire, j'imagine qu'il doit falloir utiliser cp ou mv...).

Merci.


Dell Latitude 5480
Mint Xfce
5.15.0-84-generic x86_64
Xfce 4.18.1

Hors ligne

#7 Le 29/07/2014, à 17:08

Flying-Fish

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

C'est bizarre, ça me met :

test.sh: ligne 15: Erreur de syntaxe près du symbole inattendu « } »
test.sh: ligne 15: `      taille_dossier=0; }'

Dell Latitude 5480
Mint Xfce
5.15.0-84-generic x86_64
Xfce 4.18.1

Hors ligne

#8 Le 29/07/2014, à 17:22

pingouinux

Re : [Résolu] Répartir les fichiers aléatoirement dans des dossiers

Ah oui, mille excuses ! Je corrige immédiatement (j'avais arrangé la présentation après mes tests pour que ce soit plus lisible…).

Hors ligne