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 10/11/2007, à 13:15

yleetiny

[Script] [ABANDON] Maintenir un classement des fichiers

bon j'ai fait une version décrite ci-dessous, mais avant de developper plus l'interface graphique (pour le moment uniquement la partie configuration l'est en utilisant zenity)...
EDIT> voir le post #3 pour la description du programme
j'aimerais savoir si le programme est vraiment stable...
Je lances donc un appel aux testeurs...
l'utilisation du code est inscrit au début du script.


Voici la bête:

#!/bin/bash
#----------------------------------------------------------
#
#DESCRIPTION: script permettant de maintenir son classement
#
#DEPENDANCES : zenity
#USAGE: 
# "" execute avec les options par défaut
# -t "ddc" classe en fonction des sous-répertoires de "ddc" (dossier déjà  classé)
# -d "dir_a_classer" classe le dossier "dir_a_classer"
# -c permet de configurer les valeurs par défauts
# -a annule le dernier classement effectué.
# -e "com" execute les scripts externe "com"
#----------------------------------------------------------

#paramètres :
IFS_bakcup=$IFS
IFS=$'\t\n' #permet de supprimer l'espace comme séparateur d'arguments

#==============================================================
##les paramètres du script
#==============================================================

#gestion des classements par types de fichier
FICH_CONF="$HOME/.classer.conf"
#
if [ "$1" = "-c" ] || [ ! -x $FICH_CONF ]  
then
    echo "passage en mode configuration"
    FICH_LOG=${FICH_LOG:-"/tmp/classer.log"}
    INTERFACE_GRAPHIQUE=1
    DIR_A_CLASSER_PAR_DEFAUT="$PWD"
    DIR_DEJA_CLASSE_PAR_DEFAUT="$HOME"
else
    . $FICH_CONF
fi


#==============================================================
##les petites fonctions
#==============================================================
#====
Rech_Deplacer()# 
{
DirRech="$1"
String="*$2*"
DirDest="$3"
find "$DirRech" -wholename "$DirDest" -prune -o -type f -iname "$String" -exec mv -v -t "$DirDest" '{}'>>$FICH_LOG \; 
}
#====
Suppr_Dossiers_Vides()
{
    Lst_Dossiers=( $(find "$1" -type d -print) )
    for Dir in ${Lst_Dossiers[@]}
    do
	nb_fichiers=$(ls -A "$Dir" | wc -l) 
	if [ $nb_fichiers -eq 0 ]
	then
	    echo "suppression: $Dir" >> $FICH_LOG
	    rmdir -v "$Dir"
	fi
    done
}
#====
maintenir_orga() #
{
    if ! [ $(expr ${#@} % 2) -eq 0 ]
    then
	echo "mauvais nombre d'arguments"
	exit 0
    fi
    args=( $@ )
    index_max=$(( ${#args[*]} / 2))
 
    echo "" > $FICH_LOG
    for ((index=0 ;index < index_max; index++))  
    do
	DirAOrga="${args[index]}"
	DirOrga="${args[index+1]}"
       #le classement
	LstDirOrg=( $(find $DirOrga -maxdepth 1 -type d -print) )
	for Dir in ${LstDirOrg[@]}
	do
	if [ $Dir != "." ]
	then
	    String="$(basename $Dir)"
	    echo -e "classement: $DirAOrga $String $Dir" >>$FICH_LOG 
	    Rech_Deplacer $DirAOrga $String $Dir 
	fi
	done
      #suppression des dossiers vides
	Suppr_Dossiers_Vides $DirAOrga
    done    
}
#===
Appeller_script_ext()
{
    for script in ${scripts_sup[*]}
    do
	if [ "$(basename $script)" = "$2" ]
	    then
	    echo "appel du script externe: $2 "
	    shift;shift
	    $script "$*"
	    exit 0
	fi
    done
    
    echo -e "script non trouvé.\nLISTE DES SCRIPTS DISPONNIBLES:"
    echo -e "chemin du script \t commande associée" 
    for script in ${scripts_sup[*]}
    do
	 echo -e "$script \t $(basename $script)" 
    done
    exit 0
}
#===
Annuler()
{
for suppr in $(grep "suppression:" $FICH_LOG)
do 
    suppr=${suppr#"suppression: "}
    mkdir -pv "$suppr"
done

for deplacement in $(grep "\->" $FICH_LOG)
do
    C_Ori=$(echo ${deplacement} | awk '{print $1}')
    C_Ori=${C_Ori//"\`"/""}
    C_Ori=${C_Ori//"'"/""}
    C_Fin=$(echo ${deplacement} | awk '{print $3}')
    C_Fin=${C_Fin//"\`"/""}
    C_Fin=${C_Fin//"'"/""}
    mv -v -T "$C_Fin" "$C_Ori" 
done
exit 0
}

#=======================================
#inteface utilisateur
#=======================================
#====
Configurer()#
{
#demande de reconfiguration
    if [ -f $FICH_CONF ]
    then 
	if $(zenity --question \
	    --text="Fichier de configuration $FICH_CONF existe :\n Voulez vous l'écraser?")
	then
	    echo "" > $FICH_CONF
	    chmod +x $FICH_CONF
	else
	    zenity --info \
		--text="configuration précendente conservée"
	    exit 0
	fi
    fi

    #demande le type d'interface
    if $(zenity --question --text="Voulez vous une interface graphique?")
    then 
	echo "INTERFACE_GRAPHIQUE=1" >> $FICH_CONF
    else
	echo "INTERFACE_GRAPHIQUE=0" >> $FICH_CONF
    fi

    #demande des paramètres par défaut
    DOSS=$(zenity --file-selection --directory \
	--title="Dossier à  classer par défaut" \
	--text="Quel est le dossier à  classer par défaut")
    echo -e "DIR_A_CLASSER_PAR_DEFAUT=\"$DOSS\"" >> $FICH_CONF
    
    DOSS=$(zenity --file-selection --directory \
	--title="Dossier déjà  classé par défaut" \
	--text="Quel est le dossier à  classer par défaut")
    echo -e "DIR_DEJA_CLASSE_PAR_DEFAUT=\"$DOSS\"" >> $FICH_CONF
    echo -e "FICH_LOG=\"$FICH_LOG\"" >> $FICH_CONF
    
    #ajout des scripts externe
    nbse=0
    Ajouter_script_externe()
    {
	if $(zenity --question --text="$nbse script\(s\) externe\(s\) existant\(s\) \n Voulez vous ajoutez un script externe?")
	then 
	    CHEMIN_FICHIER=$(zenity --file-selection \
		--title="sélection du script supplémentaire" \
		--text="Veuillez sélectionner le script supplémentaire") 
	 if [ -x $CHEMIN_FICHIER ]
	 then
	     script_sup=$CHEMIN_FICHIER
	     echo -e "scripts_sup[${nbse}]='$script_sup'"  >> $FICH_CONF
	     nbse=$(($nbse+1))
	 else
	     zenity --error \
		--text="le script n'est pas valide : fichier non executable"
	 fi
	 Ajouter_script_externe
	else
	    more $FICH_CONF
	    exit 0
	fi
    } 
    Ajouter_script_externe
}

#---------------------------------------------------
#l'interface du programme en lui meme 
if [ ! -x $FICH_CONF ] 
then
    echo "fichier de configuration non trouvé"
    echo "passage en mode configuration"
    Configurer
fi

DIR_A_CLASSER="$DIR_A_CLASSER_PAR_DEFAUT" 
DIR_DEJA_CLASSE="${DIR_DEJA_CLASSE_PAR_DEFAUT}"
while getopts "acd:e:t:" Option
do
    case $Option in
	a ) Annuler ;;
	c ) Configurer ;;
	d ) DIR_A_CLASSER="$OPTARG";;
	e ) Appeller_script_ext $*  ;;
	t ) DIR_DEJA_CLASSE="$OPTARG" ;;
	* ) echo "erreur"; exit 0 ;;
    esac
done
maintenir_orga "$DIR_A_CLASSER" "${DIR_DEJA_CLASSE}"

Idées, suggestions, retours d'expériences sont bienvenues...
tout autant que les bugs, qui m'aideront à  le rendre plus stable...

Dernière modification par yleetiny (Le 18/12/2007, à 17:22)


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#2 Le 10/11/2007, à 13:58

xelator

Re : [Script] [ABANDON] Maintenir un classement des fichiers

pour le dossier . , mv ne le déplacera pas car il n'a pas l'option -r
donc ce n'est pas gênant si ?

Hors ligne

#3 Le 10/11/2007, à 14:17

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

la gêne provient que "." sera reconnu dans les noms des fichiers à  classer et donc tout risque d'être déplacer dans le dossier classé . et non ses sous-dossiers.

=====================================
ANCIEN MESSAGE
=====================================

Bonjour,
comme je suis un peu désorganisé (méthode du tout dans un meme répertoire)... j'aimerais créer un script pour maintenir l'organisation de mes fichiers.

[b]Description de la situation :
Je possède des dossiers déjà  classés...
Je possède un dossier fouretout.

Mon But :
1- gérer les caractères spéciaux autre que l'espace (les accollades par exemples)
2- gérer les récursivités - ie: les sous-dossiers des "sous-dossiers du dossier classé"
3- gérer un classement automatique... en comparant les noms des fichiers (par exemple si il y a + de n fichiers avec le même motif dans le noms, on créé un dossier avec pour nom le motif et on dépace les fichiers vers celui-ci)

Ce qui est implémenter:
1- classement du dossier à  classer en fonction des sous-répertoires d'un dossier déjà  classé
2- le classement du dossier à  classer en fonction des extensions ou des types mimes, en appelant d'autres scripts (xelator et/ou skippy le grand gourou)
3- suppression des dossiers vides restants après le classement

Idées à  developper:
1- création d'un fichier log, permettant ensuite l'annulation des commandes faites
2- une interface, graphique ou non
3- vérification des archives extraites,si oui, on supprime les archives, si non on extrait, et on classe

Mes soucis :
Actuels:
1- gestion des caractères spéciaux dans les noms ([ et autres)-- les espaces étants déjà  gérés
    du genre convertir une chaine de caractères avec des caractères spéciaux en une littérale automatiquement (ajouts des \ qui vont bien)
2- quelle est la commande la plus simple/flexible permettant de comparer deux chaà®nes de caractères?
(trouver les points commun et autre, à  l'image du diff/Tkdiff pour les fichiers)
Pour plus tard
1- comment faire un find avec plusieurs dossiers non cherchés (-prune)?
Merci d'avance pour vos réponses...

Mon code actuel :

#!/bin/bash
#----------------------------------------------------------
#
#DESCRIPTION: script permettant de maintenir son classement
#
#----------------------------------------------------------

#paramètres :
IFS_bakcup=$IFS
IFS=$'\t\n' #permet de supprimer l'espace comme séparateur d'arguments

#==============================================================
##les paramètres du script
#==============================================================

#gestion des classements par types de fichier
#appels des autres scripts.
CLASSER_PAR_MIME="~/tests/skippy" #pour classer par les types mime, par ex: chemin du script vers celui de skippy le grand gourou
CLASSER_PAR_EXT="~/tests/xelator" #pour classer par les extensions par ex: chemin du script vers celui de xelator

#autres
D_DEJA_CLASS_DEFAULT="~/DOSS_CLASSE" #chemin vers le dossier déjà  classé par défault

#==============================================================
##les petites fonctions
#==============================================================

Rech_Deplacer()# 
{
DirRech="$1"
String="*$2*"
DirDest="$3"
find "$DirRech" -wholename "$DirDest" -prune -o -type f -iname "$String" -exec mv -v -t "$DirDest" '{}'   \; 
}

Suppr_Dossiers_Vides()
{
    Lst_Dossiers=$(find "$1" -type d -print)
    #echo $Lst_Dossiers
    for Dir in $Lst_Dossiers
    do
	nb_fichiers=$(ls -A "$Dir" | wc -l)
	if [ $nb_fichiers -eq 0 ]
	then
	    #echo "supression de $Dir"
	    rmdir -v "$Dir"
	fi
    done
}

maintenir_orga() #
{
DirAOrga="$1"
DirOrga="$2"

#le classement
LstDirOrg=$(find $DirOrga -maxdepth 1 -type d -print)
for Dir in $LstDirOrg
do
   if [ $Dir != "." ]
   then
       String="$(basename $Dir)"
        #echo -e $DirAOrga $String $Dir 
	Rech_Deplacer $DirAOrga $String $Dir 
   fi
done
#suppression des dossiers vides
Suppr_Dossiers_Vides $DirAOrga
}


#=======================================
#inteface utilisateur
#=======================================
if [ $# -eq 0 ]
then
    maintenir_orga "$PWD" $D_DEJA_CLASS_DEFAULT
elif [ $# -eq 1 ]
then
    maintenir_orga "$1" $D_DEJA_CLASS_DEFAULT
elif [ $# -eq 2 ]
then
    if [ "$1" = "--mime" ]
    then 
	echo $CLASSER_PAR_MIME "$2"
    elif [ "$1" = "--ext" ]
    then
	echo $CLASSER_PAR_EXT "$2"
    else
	maintenir_orga "$1" "$2"
    fi
else
    echo "cas non traitee..."
fi

#remise en place des valeurs IFS initiales
IFS=$IFS_backup #ou unset IFS

Pourriez-vous m'aider s'il vous plaà®t?
(ce programme interesse aussi d'autres personnes -> cf forum dossier_magique )


======================================================================
Codes existants (extraits du dossier_magiques)
1- par "Skippy le Grand Gourou" : pour classer par fonctions (Videos, documents, etc. ) grà¢ce au "file -i". (ne gère pas les récurences, on peut le trouver sur le wiki "dossier_magique")

#!/bin/bash

# Définitions des répertoires, à  adapter :
DIR=${HOME}
TXT=${DIR}/Documents
PDF=${DIR}/Documents
AUDIO=${DIR}/Musique
VIDEO=${DIR}/Vidéos
IMG=${DIR}/Images
ARCHIVES=${DIR}/Archives
DOCS=${DIR}/Documents
TEX=${DIR}/Documents
MISC=${DIR}/Divers


# Fichier de log :
LOG=/dev/null


# Déplacement d'un fichier et mise à  jour du fichier log :
function bouge()
{
    mv ${1} ${2}
    heure=`date +%D-%H:%m`
    echo "[${heure}] ${1} déplacé dans ${2}" >> ${LOG}
    return 0
}


# Créons les répertoires s'ils n'existent pas :
function createdirs()
{
    mkdir -p ${TXT}
    mkdir -p ${PDF}
    mkdir -p ${AUDIO}
    mkdir -p ${VIDEO}
    mkdir -p ${IMG}
    mkdir -p ${ARCHIVES}
    mkdir -p ${DOCS}
    mkdir -p ${TEX}
    mkdir -p ${MISC}

    return 0
}

# Trions les fichiers :
function tri()
{
    cd ${1}
    ls > /tmp/tri
    sed -i 's/\ /_/g' /tmp/tri
    echo "Triage des fichiers du répertoire ${1}..."
    while read fichier
    do
        # Utilisons si possible le type mime :
        type=`file -bi ${fichier}`

        case ${type} in
            *text*) bouge ${fichier} ${TXT};;
        
            *pdf* | *dvi* | *postscript*) bouge ${fichier} ${PDF};;
            
            *audio* | *ogg*) bouge ${fichier} ${AUDIO};;
        
            *video* | *flash*) bouge ${fichier} ${VIDEO};;
    
            *image*) bouge ${fichier} ${IMG};;

            *tar* | *rar* | *zip*) bouge ${fichier} ${ARCHIVES};;

            *shellscript*) bouge ${fichier} ${TXT};;
            
            *msword*) bouge ${fichier} ${DOCS};;
        esac
        
        # Si le type mime ne suffit pas :
        type=`file -b ${fichier}`

        case ${type} in
            *directory*) continue;;
               
            *LaTeX*) bouge ${fichier} ${TEX};;
        
            *ASF*) bouge ${fichier} ${VIDEO};;
    
                      # Type inconnu :
            *) bouge ${fichier} ${MISC};;
        esac

    done < /tmp/tri

    echo "Terminé."
    cd ${OLDDIR}

    return 0
}


# Si des répertoires sont passés en argument, on les trie, sinon on trie le répertoire par défaut
OLDDIR=`pwd`
createdirs
if [ $# -eq 0 ]
then
    tri ${DIR}
else
    while [ $# -gt 0 ]
    do
        tri ${1}
        shift
    done
fi
exit 0

2- par xelator : même type de tri que 1, mais en classant à  partir des extensions.

(rédaction en cours car il existe plusieurs versions)

3- par mimioux : même chose que xelator, mais en perl...cf post #6

Dernière modification par yleetiny (Le 26/11/2007, à 22:44)


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#4 Le 15/11/2007, à 12:41

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Bon plutà´t que de faire un seul script bash... j'ai développé quelques fonctions à  appeler comme bon vous semble...

#!/bin/bash
#----------------------------------------------------------
#
#DESCRIPTION: script permettant de maintenir son classement
#
#----------------------------------------------------------

#paramètres :
IFS_bakcup=$IFS
IFS=$'\t\n' #permet de supprimer l'espace comme séparateur d'arguments

Rech_Deplacer()# 
{
DirRech="$1"
String="*$2*"
DirDest="$3"
find "$DirRech" -wholename "$DirDest" -prune -o -type f -iname "$String" -exec mv -v -t "$DirDest" '{}'  \; 
}

maintenir_orga() #
{
DirAOrga="$1"
DirOrga="$2"

LstDirOrg=$(find $DirOrga -maxdepth 1 -type d -print)

for Dir in $LstDirOrg
do
   if [ $Dir != "." ]
   then
       String="$(basename $Dir)"
        #echo -e $DirAOrga $String $Dir 
	Rech_Deplacer $DirAOrga $String $Dir 
   fi
done


}
#Utilisations
#maintenir_orga "DirAClasser" "DirDéjà Classé" (chemin complet)


#remise en place des valeurs initiales
IFS=$IFS_backup #ou unset IFS

Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#5 Le 15/11/2007, à 13:07

Gojita

Re : [Script] [ABANDON] Maintenir un classement des fichiers

pour ne pas prendre en compte le répertoire '.'

tu rajoute un

find .... | egrep -v  '^.$'

Il y a 10 sortes de personnes
Celles qui savent compter en binaires et les autres.

Hors ligne

#6 Le 23/11/2007, à 20:35

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

juste pour signaler une mise à jour de mon premier post....


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#7 Le 25/11/2007, à 14:57

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

NOUVELLE IDEE
je crois avoir trouvé comment faire une belle interface graphique: utilisation de zenity...
on peut même envisager de créer la configuration par défaut... à  travers celle-ci.


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#8 Le 26/11/2007, à 11:03

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

bon je me remets à  programmer, la plupart de mes probs sont résolus...maintenant....
je passe progressivement à  une interface graphique par zenity...

(le post #1 n'est plus à  jour mais c'est pas grave)

Version en développement.
Euh... juste pour ne pas froisser les gens... j'ai pas implémenté toutes les fonctions...mais je leur ai laissé la possibilité d'appeler des scripts externes...


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#9 Le 26/11/2007, à 13:40

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

NEWS: je lance un appel aux testeurs...

en espérant que mon programme plaira...


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#10 Le 26/11/2007, à 18:51

U-topic

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Heu chez moi ca ne marche pas...
Voici une tite partie des messages d'erreur :

~/Desktop]% ./rangement Default
./rangemt: line 33: /home/y/.classer.conf: Aucun fichier ou répertoire de ce type
find: AVERTISSEMENT: les noms de fichiers Unix habituellement ne contiennent pas de barre obliques (sauf pour les chemins).  Cela signifie que '-iname *./ov51x-jpeg-1.5.2*' sera évaluer comme étant faux tout le temps sur ce système.  Vous pouvez trouver que le test '-wholename' est plus utile ou encore celui de '-samefile'.  Alternativement, si vous utilisez GNU grep, vous devriez utiliser 'find ... -print0 | grep -FzZ *./ov51x-jpeg-1.5.2*'.

Peut etre n'ais-je pas fait la bonne manip...En tout cas ce script est une très bonne idée...

Hors ligne

#11 Le 26/11/2007, à 20:30

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Ah oui, il faut que tu lances une première fois la configuration par :
ca te permet de créer un fichier configuration d'abord
./rangement -c

Bon ben premier bug...

Dernière modification par yleetiny (Le 26/11/2007, à 20:35)


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#12 Le 26/11/2007, à 20:52

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

j'ai modifié le code...ca doit passer sans faire le -c au départ.... (si le fichier n'existe pas, il passera en mode configuration)
et Merci U-topic!

Dernière modification par yleetiny (Le 26/11/2007, à 20:52)


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#13 Le 26/11/2007, à 22:06

U-topic

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Oki ! j'ai pris la dernière version du script...
Cela dit :

~/Desktop]% ./rangemt        
find: ~: Aucun fichier ou répertoire de ce type

J'ai sauté une étape...?

Hors ligne

#14 Le 26/11/2007, à 22:08

U-topic

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Je précise que je n'est pas eu le mode configuration même avec l'option-c

Hors ligne

#15 Le 26/11/2007, à 22:23

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

étrange, je me suis peut-être trompé quelque part:
en attendant voici le fichier sur lequel je bosse (et qui fonctionne chez moi en tout cas)

#!/bin/bash
#----------------------------------------------------------
#
#DESCRIPTION: script permettant de maintenir son classement
#
#DEPENDANCES : zenity
#USAGE: 
# "" execute avec les options par défaut
# -t "ddc" classe en fonction des sous-répertoires de "ddc" (dossier déjà  classé)
# -d "dir_a_classer" classe le dossier "dir_a_classer"
# -c permet de configurer les valeurs par défauts
# -a annule le dernier classement effectué.
# -e "com" execute les scripts externe "com"
#----------------------------------------------------------

#paramètres :
IFS_bakcup=$IFS
IFS=$'\t\n' #permet de supprimer l'espace comme séparateur d'arguments

#==============================================================
##les paramètres du script
#==============================================================

#gestion des classements par types de fichier
FICH_CONF="$HOME/.classer.conf"
#
if [ "$1" = "-c" ] || [ ! -x $FICH_CONF ]  
then
    echo "passage en mode configuration"
    FICH_LOG=${FICH_LOG:-"/tmp/classer.log"}
    INTERFACE_GRAPHIQUE=1
    DIR_A_CLASSER_PAR_DEFAUT="$PWD"
    DIR_DEJA_CLASSE_PAR_DEFAUT="$HOME"
else
    . $FICH_CONF
fi


#==============================================================
##les petites fonctions
#==============================================================
#====
Rech_Deplacer()# 
{
DirRech="$1"
String="*$2*"
DirDest="$3"
find "$DirRech" -wholename "$DirDest" -prune -o -type f -iname "$String" -exec mv -v -t "$DirDest" '{}'>>$FICH_LOG \; 
}
#====
Suppr_Dossiers_Vides()
{
    Lst_Dossiers=( $(find "$1" -type d -print) )
    for Dir in ${Lst_Dossiers[@]}
    do
	nb_fichiers=$(ls -A "$Dir" | wc -l) 
	if [ $nb_fichiers -eq 0 ]
	then
	    echo "suppression: $Dir" >> $FICH_LOG
	    rmdir -v "$Dir"
	fi
    done
}
#====
maintenir_orga() #
{
    if ! [ $(expr ${#@} % 2) -eq 0 ]
    then
	echo "mauvais nombre d'arguments"
	exit 0
    fi
    args=( $@ )
    index_max=$(( ${#args[*]} / 2))
 
    echo "" > $FICH_LOG
    for ((index=0 ;index < index_max; index++))  
    do
	DirAOrga="${args[index]}"
	DirOrga="${args[index+1]}"
       #le classement
	LstDirOrg=( $(find $DirOrga -maxdepth 1 -type d -print) )
	for Dir in ${LstDirOrg[@]}
	do
	if [ $Dir != "." ]
	then
	    String="$(basename $Dir)"
	    echo -e "classement: $DirAOrga $String $Dir" >>$FICH_LOG 
	    Rech_Deplacer $DirAOrga $String $Dir 
	fi
	done
      #suppression des dossiers vides
	Suppr_Dossiers_Vides $DirAOrga
    done    
}
#===
Appeller_script_ext()
{
    for script in ${scripts_sup[*]}
    do
	if [ "$(basename $script)" = "$2" ]
	    then
	    echo "appel du script externe: $2 "
	    shift;shift
	    $script "$*"
	    exit 0
	fi
    done
    
    echo -e "script non trouvé.\nLISTE DES SCRIPTS DISPONNIBLES:"
    echo -e "chemin du script \t commande associée" 
    for script in ${scripts_sup[*]}
    do
	 echo -e "$script \t $(basename $script)" 
    done
    exit 0
}
#===
Annuler()
{
for suppr in $(grep "suppression:" $FICH_LOG)
do 
    suppr=${suppr#"suppression: "}
    mkdir -pv "$suppr"
done

for deplacement in $(grep "\->" $FICH_LOG)
do
    C_Ori=$(echo ${deplacement} | awk '{print $1}')
    C_Ori=${C_Ori//"\`"/""}
    C_Ori=${C_Ori//"'"/""}
    C_Fin=$(echo ${deplacement} | awk '{print $3}')
    C_Fin=${C_Fin//"\`"/""}
    C_Fin=${C_Fin//"'"/""}
    mv -v -T "$C_Fin" "$C_Ori" 
done
exit 0
}

#=======================================
#inteface utilisateur
#=======================================
#====
Configurer()#
{
#demande de reconfiguration
    if [ -f $FICH_CONF ]
    then 
	if $(zenity --question \
	    --text="Fichier de configuration $FICH_CONF existe :\n Voulez vous l'écraser?")
	then
	    echo "" > $FICH_CONF
	    chmod +x $FICH_CONF
	else
	    zenity --info \
		--text="configuration précendente conservée"
	    exit 0
	fi
    fi

    #demande le type d'interface
    if $(zenity --question --text="Voulez vous une interface graphique?")
    then 
	echo "INTERFACE_GRAPHIQUE=1" >> $FICH_CONF
    else
	echo "INTERFACE_GRAPHIQUE=0" >> $FICH_CONF
    fi

    #demande des paramètres par défaut
    DOSS=$(zenity --file-selection --directory \
	--title="Dossier à  classer par défaut" \
	--text="Quel est le dossier à  classer par défaut")
    echo -e "DIR_A_CLASSER_PAR_DEFAUT=\"$DOSS\"" >> $FICH_CONF
    
    DOSS=$(zenity --file-selection --directory \
	--title="Dossier déjà  classé par défaut" \
	--text="Quel est le dossier à  classer par défaut")
    echo -e "DIR_DEJA_CLASSE_PAR_DEFAUT=\"$DOSS\"" >> $FICH_CONF
    echo -e "FICH_LOG=\"$FICH_LOG\"" >> $FICH_CONF
    
    #ajout des scripts externe
    nbse=0
    Ajouter_script_externe()
    {
	if $(zenity --question --text="$nbse script\(s\) externe\(s\) existant\(s\) \n Voulez vous ajoutez un script externe?")
	then 
	    CHEMIN_FICHIER=$(zenity --file-selection \
		--title="sélection du script supplémentaire" \
		--text="Veuillez sélectionner le script supplémentaire") 
	 if [ -x $CHEMIN_FICHIER ]
	 then
	     script_sup=$CHEMIN_FICHIER
	     echo -e "scripts_sup[${nbse}]='$script_sup'"  >> $FICH_CONF
	     nbse=$(($nbse+1))
	 else
	     zenity --error \
		--text="le script n'est pas valide : fichier non executable"
	 fi
	 Ajouter_script_externe
	else
	    more $FICH_CONF
	    exit 0
	fi
    } 
    Ajouter_script_externe
}

#---------------------------------------------------
#l'interface du programme en lui meme 
if [ ! -x $FICH_CONF ] 
then
    echo "fichier de configuration non trouvé"
    echo "passage en mode configuration"
    Configurer
fi

DIR_A_CLASSER="$DIR_A_CLASSER_PAR_DEFAUT" 
DIR_DEJA_CLASSE="${DIR_DEJA_CLASSE_PAR_DEFAUT}"
while getopts "acd:e:t:" Option
do
    case $Option in
	a ) Annuler ;;
	c ) Configurer ;;
	d ) DIR_A_CLASSER="$OPTARG";;
	e ) Appeller_script_ext $*  ;;
	t ) DIR_DEJA_CLASSE="$OPTARG" ;;
	* ) echo "erreur"; exit 0 ;;
    esac
done
maintenir_orga "$DIR_A_CLASSER" "${DIR_DEJA_CLASSE}"

si ca marche pas meme avec l'option -c, ca voudrait dire que mon code n'est pas portable...
ce serait super nul....
si cette version marche, je modifierais avec celui plus-haut

Dernière modification par yleetiny (Le 26/11/2007, à 22:26)


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#16 Le 26/11/2007, à 22:31

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

bizarre, bizarre, je viens de copier le code que j'ai donné au post#1.
et chez moi, il fonctionne...
peux-tu mettre les messages d'erreurs stp?

EDIT>
oups, tu as déjà  poster le message d'erreur.
Encore merci pour ton aide
pourrais-tu véririfié s'il existe un fichier "/tmp/classer.log" ou "$HOME/.classer.conf"
et les poster s'ils existent...

Dernière modification par yleetiny (Le 26/11/2007, à 22:41)


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#17 Le 26/11/2007, à 22:40

U-topic

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Yep celui la marche cool
EDIT: c'est quoi cette histoire de script externe tongue

Dernière modification par U-topic (Le 26/11/2007, à 22:42)

Hors ligne

#18 Le 26/11/2007, à 22:43

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

cool, bon, j'avais remplacé que les bouts de code que j'avais changé....
je vais faire une vraie update et ne gardez que celui en développement.


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne

#19 Le 12/12/2007, à 19:59

U-topic

Re : [Script] [ABANDON] Maintenir un classement des fichiers

Pas de nouvelles ?

Hors ligne

#20 Le 14/12/2007, à 03:33

yleetiny

Re : [Script] [ABANDON] Maintenir un classement des fichiers

ah oui, j'avoue que j'ai mis le script de coté, parce qu'après mure réflexion il est pas très bien codé, et du coup les ajouts avancés devenaient problématiques.
Ayant un peu la flemme de tout refaire, j'ai laissé tombé, et puis comme ca ne tente pas tant de monde que ca je me suis dit que c'était pas une grosse perte.

En fait, c'est pas bien difficile, mais surtout très long (j'avais pensé à gérer plutot des listes de répertoires plutot que de simples répertoires, faire un peu tout)

ah oui, pour la liste de scripts externes: ben vu que certains de mes classement ne plaisent pas à tout le monde, j'avais laisser là possibilités à l'utilisateur de définir sont propres programme, le mien servant juste de relais, ce qui permet de lui rajouter des fonctionalités du style classement par mime ou autre.

En fait, à la fin de ma programmation, lorsque je me suis mis à faire l'interface, je me suis rendu compte, que le mieux c'était de :
1- laisser la liberté à l'utilisateur pour la configuration
2- permettre de faire un listing des classements à executer dans un ordre
3- l'utilisateur n'aurais qu'à lancer le programme configuré, comme il le souhaite
par contre ca demandait une réécriture assez poussée du code...alors j'avais laissé tombé.
en plus je me suis rendu compte que l'intégration graphique zenity possède très vite des limites et ce qui rend tout cela pas toujours convivial....
Après on peut aussi dire que meme si je code pas comme un cochon, je suis bien loin de faire des trucs clean à la manière d'un vrai développeur de scripts.

Si ca motive vraiment des personnes qu'elles se fassent connaître...


Ordinateurs : SONY VAIO C2Z/B & EEEPC 701
Merci de mettre [RESOLU] dans vos postes si le problème est réglé,
et Merci de partager vos expériences

Hors ligne