Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| dossier_magique [Le 07/11/2007, 02:27] – 82.229.251.158 | dossier_magique [Le 11/09/2022, 11:55] (Version actuelle) – Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) moths-art | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag>dossier magique trier tri fichiers medias | + | {{tag>fichier |
| + | ---- | ||
| - | ====== Dossier magique ====== | + | ====== Dossier magique |
| - | Sur [[http:// | + | En 2007, sur [[https:// |
| + | Le code a été remanié en 2015 par erresse, afin d' | ||
| + | ===== Fichiers reconnus ===== | ||
| - | ==== Fichiers reconnus ==== | + | Actuellement, |
| - | Actuellement, | ||
| + | ===== Le script ===== | ||
| - | ==== Le script ==== | + | Copiez-collez le script suivant dans un fichier, que vous appellerez par exemple |
| - | + | ||
| - | Copiez-collez le script suivant dans un fichier, que vous appellerez par exemple dossier_magique, pour faire original : | + | |
| < | < | ||
| #!/bin/bash | #!/bin/bash | ||
| - | # Définitions des répertoires, | + | CURRENT_VER=1.1 |
| - | DIR=/ | + | |
| - | TXT=${DIR}/ | + | |
| - | PDF=${DIR}/ | + | |
| - | AUDIO=${DIR}/ | + | |
| - | VIDEO=${DIR}/ | + | |
| - | IMG=${DIR}/ | + | |
| - | ARCHIVES=${DIR}/ | + | |
| - | DOCS=${DIR}/ | + | |
| - | TEX=${DIR}/ | + | |
| - | MISC=${DIR}/ | + | |
| + | # initialisation des options | ||
| - | # Fichier de log : | + | TERMINAL=" |
| - | LOG=/dev/null | + | AIDE=" |
| + | VERSION=" | ||
| + | RECURSIF=" | ||
| + | # Définition des fonctions du script | ||
| + | |||
| + | # Test du code retour de zenity : | ||
| + | function testcrd() | ||
| + | { | ||
| + | if [ ${crd} = -1 ]; then | ||
| + | zenity --error --title " | ||
| + | exit 2 | ||
| + | fi | ||
| + | if [ ${crd} = 1 ]; then | ||
| + | zenity --info --title " | ||
| + | exit 1 | ||
| + | fi | ||
| + | return 0 | ||
| + | } | ||
| # Déplacement d'un fichier et mise à jour du fichier log : | # Déplacement d'un fichier et mise à jour du fichier log : | ||
| function bouge() | function bouge() | ||
| { | { | ||
| - | mv ${1} ${2} | + | mv "${1}" "${2}" |
| heure=`date +%D-%H:%m` | heure=`date +%D-%H:%m` | ||
| - | echo " | + | echo " |
| return 0 | return 0 | ||
| } | } | ||
| - | |||
| # Créons les répertoires s'ils n' | # Créons les répertoires s'ils n' | ||
| function createdirs() | function createdirs() | ||
| { | { | ||
| - | mkdir -p ${TXT} | + | mkdir -p "${TXT}" |
| - | mkdir -p ${PDF} | + | mkdir -p "${PDF}" |
| - | mkdir -p ${AUDIO} | + | mkdir -p "${AUDIO}" |
| - | mkdir -p ${VIDEO} | + | mkdir -p "${VIDEO}" |
| - | mkdir -p ${IMG} | + | mkdir -p "${IMG}" |
| - | mkdir -p ${ARCHIVES} | + | mkdir -p "${ARCHIVES}" |
| - | mkdir -p ${DOCS} | + | mkdir -p "${DOCS}" |
| - | mkdir -p ${TEX} | + | mkdir -p "${TEX}" |
| - | mkdir -p ${MISC} | + | mkdir -p "${MISC}" |
| + | mkdir -p " | ||
| return 0 | return 0 | ||
| Ligne 65: | Ligne 74: | ||
| function tri() | function tri() | ||
| { | { | ||
| - | cd ${1} | + | cd "${1}" |
| + | # Faut-il gérer la récursivité pour les sources ? | ||
| + | if [[ " | ||
| + | then | ||
| + | crd=0 | ||
| + | while [ ${crd} = 0 ] | ||
| + | do | ||
| + | ls -d */ 2> /dev/null > /tmp/tri | ||
| + | crd=$? | ||
| + | while read dossier | ||
| + | do | ||
| + | # On remonte tout le dossier d'un niveau | ||
| + | mv -t " | ||
| + | # Puis on supprime le dossier vide | ||
| + | rmdir " | ||
| + | done < /tmp/tri | ||
| + | done | ||
| + | fi | ||
| ls > /tmp/tri | ls > /tmp/tri | ||
| - | sed -i 's/\ /_/g' /tmp/tri | ||
| - | echo " | ||
| while read fichier | while read fichier | ||
| do | do | ||
| - | | + | # Cas particulier des fichiers à traiter d' |
| - | type=`file -bi ${fichier}` | + | type="${fichier## |
| + | case " | ||
| + | wma) bouge " | ||
| - | | + | *) # Utilisons si possible le type mime : |
| - | *text*) bouge ${fichier} ${TXT};; | + | type=`file -bi " |
| + | |||
| + | | ||
| + | *script*) bouge " | ||
| + | | ||
| + | | ||
| | | ||
| - | | + | |
| | | ||
| - | | + | |
| | | ||
| - | | + | |
| | | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | | + | |
| - | esac | + | |
| - | + | ||
| - | # Si le type mime ne suffit pas : | + | |
| - | type=`file -b ${fichier}` | + | |
| - | | + | *) # Si le type mime ne suffit pas : |
| - | *directory*) continue;; | + | type=`file -b " |
| + | |||
| + | case "${type}" | ||
| + | | ||
| - | | + | *byte-compiled*) bouge " |
| + | |||
| + | *script*) bouge " | ||
| + | |||
| + | | ||
| | | ||
| - | | + | |
| - | + | ||
| - | # Type inconnu : | + | |
| - | *) bouge ${fichier} ${MISC};; | + | |
| - | esac | + | |
| + | *text*) bouge " | ||
| + | | ||
| + | *) # Le type est donc inconnu : | ||
| + | bouge " | ||
| + | esac | ||
| + | ;; | ||
| + | esac | ||
| + | ;; | ||
| + | esac | ||
| + | | ||
| done < /tmp/tri | done < /tmp/tri | ||
| - | |||
| - | echo " | ||
| - | cd ${OLDDIR} | ||
| return 0 | return 0 | ||
| } | } | ||
| + | # Testons d' | ||
| + | while getopts ": | ||
| + | do | ||
| + | # gestion des options longues avec ou sans argument | ||
| + | [ $OPT = " | ||
| + | aide) OPT=" | ||
| + | graphique) OPT=" | ||
| + | recursif) OPT=" | ||
| + | terminal) OPT=" | ||
| + | version) OPT=" | ||
| + | *) echo " | ||
| + | esac | ||
| + | # puis gestion des options courtes | ||
| + | case $OPT in | ||
| + | a) AIDE=" | ||
| + | g) TERMINAL=" | ||
| + | r) RECURSIF=" | ||
| + | t) TERMINAL=" | ||
| + | v) VERSION=" | ||
| + | *) echo " | ||
| + | esac | ||
| + | done | ||
| - | # Si des répertoires sont passés | + | # Aide |
| + | |||
| + | if [ " | ||
| + | then | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | # Version | ||
| + | |||
| + | if [ " | ||
| + | then | ||
| + | echo " " | ||
| + | echo " | ||
| + | # head -15 $0 | grep -v bash | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | # Mémorisons | ||
| OLDDIR=`pwd` | OLDDIR=`pwd` | ||
| - | createdirs | + | # Initialisons le dossier racine CIBLE |
| - | if [ $# -eq 0 ] | + | DIR=" |
| + | # Définissons le fichier de log (aucun par défaut) | ||
| + | LOG="/ | ||
| + | |||
| + | # Option " | ||
| + | if [ "$TERMINAL" | ||
| then | then | ||
| - | tri ${DIR} | + | # On élimine les options pour charger le(s) paramètre(s) |
| + | while [ "${1:0:1}" = " | ||
| + | do | ||
| + | shift | ||
| + | done | ||
| + | if [ " | ||
| + | then | ||
| + | echo "En mode terminal, indiquer obligatoirement le(s) paramètre(s)" | ||
| + | exit 1 | ||
| + | fi | ||
| + | # Sinon, exécution en mode graphique | ||
| else | else | ||
| - | while [ $# -gt 0 ] | + | # On affiche d' |
| - | do | + | echo "- Vous allez tout d' |
| - | tri ${1} | + | echo " |
| - | shift | + | echo "- Vous sélectionnerez ensuite le(s) dossier(s) '' |
| - | done | + | echo " |
| + | echo "- Note : Le dossier CIBLE peut être le même que le dossier SOURCE," | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "*** Vous pouvez cliquer sur '' | ||
| + | zenity --text-info --title " | ||
| + | crd=$?; testcrd | ||
| fi | fi | ||
| + | |||
| + | # Option " | ||
| + | if [ " | ||
| + | then | ||
| + | DIR=" | ||
| + | # Sinon, exécution en mode graphique | ||
| + | else | ||
| + | # On sélectionne d' | ||
| + | DIR=$(zenity --file-selection --title " | ||
| + | crd=$?; testcrd | ||
| + | fi | ||
| + | |||
| + | |||
| + | # Option " | ||
| + | if [ " | ||
| + | then | ||
| + | # Protégeons le séparateur standard et initialisons-le à " | ||
| + | OLDIFS=" | ||
| + | IFS=' | ||
| + | fi | ||
| + | # Option " | ||
| + | if [ " | ||
| + | then | ||
| + | # On recherche le(s) paramètre(s) SOURCE(S) éventuel(s) | ||
| + | shift | ||
| + | if [ " | ||
| + | then | ||
| + | # Pas de répertoire SOURCE, alors SOURCE = CIBLE | ||
| + | TABSCE=(" | ||
| + | else | ||
| + | # On charge le (la liste des) dossier(s) SOURCE(S) | ||
| + | TABSCE=(" | ||
| + | fi | ||
| + | # Sinon, exécution en mode graphique | ||
| + | else | ||
| + | # On peut sélectionner un ou plusieurs répertoires à trier | ||
| + | # (par défaut, on trie dans le même répertoire cible=source) | ||
| + | TABSCE=($(zenity --file-selection --title " | ||
| + | crd=$?; testcrd | ||
| + | fi | ||
| + | |||
| + | # Définition des répertoires (à adapter si besoin) : | ||
| + | TXT=" | ||
| + | PDF=" | ||
| + | AUDIO=" | ||
| + | VIDEO=" | ||
| + | IMG=" | ||
| + | ARCHIVES=" | ||
| + | DOCS=" | ||
| + | TEX=" | ||
| + | MISC=" | ||
| + | BIN=" | ||
| + | |||
| + | # Création des répertoires de tri dans le dossier cible | ||
| + | createdirs | ||
| + | for SCE in " | ||
| + | do | ||
| + | # Option " | ||
| + | if [ " | ||
| + | then | ||
| + | tri " | ||
| + | else | ||
| + | tri " | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | # Restaurons le séparateur et le répertoire courant | ||
| + | IFS=" | ||
| + | cd " | ||
| + | |||
| + | # Option " | ||
| + | if [ " | ||
| + | then | ||
| + | # Restaurons le séparateur standard | ||
| + | IFS=" | ||
| + | # Nettoyons les fichiers temporaires générés | ||
| + | rm /tmp/notice /tmp/tri | ||
| + | |||
| + | zenity --info --title " | ||
| + | fi | ||
| + | |||
| exit 0 | exit 0 | ||
| </ | </ | ||
| - | Rendez | + | Enregistrez |
| - En console : | - En console : | ||
| chmod +x / | chmod +x / | ||
| - | - Sous gnome : clic droit sur le fichier > propriétés > permissions, | + | - En graphique avec le navigateur |
| - | ==== Adaptation ==== | + | ===== Adaptation |
| - | === Répertoires === | + | |
| + | ==== Répertoires | ||
| <note importante> | <note importante> | ||
| - | En l' | + | Ce script |
| + | Si vous désirez nommer différemment les sous-dossiers créés par le script, vous pouvez | ||
| </ | </ | ||
| - | Dans cet exemple, les dossiers | + | Les dossiers par défaut existent sous les versions récentes d' |
| - | === Types de fichier === | + | ==== Types de fichier |
| Pour supprimer par exemple les fichiers de type rar, il suffit de modifier la ligne : | Pour supprimer par exemple les fichiers de type rar, il suffit de modifier la ligne : | ||
| Ligne 156: | Ligne 345: | ||
| file -bi un_fichier.test | file -bi un_fichier.test | ||
| - | ==== Utilisation ==== | ||
| - | En ligne de commande : | + | ===== Utilisation ===== |
| - | dossier_magique répertoire1 répertoire2 ... | + | |
| - | Si aucun répertoire | + | **En ligne de commande :** |
| + | Le script accepte une option (longue %%--%%option ou courte -o) et un ou plusieurs paramètres. | ||
| + | Les options sont, respectivement : | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | Exemple : | ||
| + | | ||
| + | (où CIBLE, SOURCE1 ... SOURCEn sont des répertoires. CIBLE est le dossier " | ||
| + | Si seul le répertoire | ||
| - | Si les noms des répertoires contiennent des espaces et autres caractères spéciaux, mettez-les systématiquement entre guillemets et précédez ces caractères d'un slash : | + | Si les noms des répertoires contiennent des espaces et autres caractères spéciaux, mettez-les systématiquement entre guillemets et si vous référencez le dossier personnel (~/ |
| - | dossier_magique " | + | ./dossier_magique |
| - | ==== Fichier de log ==== | + | **En mode graphique :** |
| + | En mode graphique, ne spécifiez ni paramètre ni option (ou -g | %%--%%graphique qui est la valeur par défaut). Le script affiche une petite fenêtre d' | ||
| + | Si vous voulez classer le dossier CIBLE lui-même, ne choisissez pas d' | ||
| + | Si vous devez abandonner le script en cours de route (un doute sur le travail à exécuter...), | ||
| + | |||
| + | ===== Fichier de log ===== | ||
| Par défaut, il n'y a pas de fichier de log. Il suffit de modifier la ligne | Par défaut, il n'y a pas de fichier de log. Il suffit de modifier la ligne | ||
| Ligne 174: | Ligne 377: | ||
| pour garder une trace de tout mouvement de fichier dû au script. | pour garder une trace de tout mouvement de fichier dû au script. | ||
| - | ==== Exécution automatique ==== | + | ===== Exécution automatique |
| - | Pour exécuter automatiquement le script toutes les 5 minutes, par exemple, vous pouvez utiliser [[crontab]]. On édite la crontab : | + | Il est toujours possible, en lançant une exécution en ligne de commande, de faire fonctionner le script en exécution automatique. |
| + | Pour exécuter automatiquement le script toutes les 5 minutes, par exemple, vous pouvez utiliser [[:cron|crontab]]. On édite la crontab : | ||
| crontab -e | crontab -e | ||
| Et on rajoute : | Et on rajoute : | ||
| - | < | + | < |
| + | |||
| + | ===== Bonus ===== | ||
| + | |||
| + | Vous pouvez créer un lanceur sur le bureau ou dans le menu pour lancer facilement le script en mode graphique. Identifiez-le avec cette icône : | ||
| + | {{: | ||
