Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

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.

#1 Le 08/08/2017, à 21:09

kholo

[TUTO Bash] rangement automatique fichiers par extension

Bonjour à tous,
aujourd'hui un script pour organiser des fichiers selon l'extension.
C'est l'utilisateur qui va choisir le nom du dossier avec lequel chaque extension sera associée.
une vidéo de démonstration

Dorian (je l'ai appelé ainsi) va nous aider à ranger des fichiers contenus dans un dossier
son principe de fonctionnement repose sur les extensions de fichier.

En fonction de l'extension, Dorian va alimenter une base personnelle et créera un dossier
que chacun pourra choisir lors de la première découverte de l'extension.

Si le fichier ne comporte pas d'extension Dorian se contente de le ranger par Type Mime et
créera donc des dossiers et sous dossiers en fonction des types Mime trouvés

PARTIE 1
le script principal dorian
créez un dossier

mkdir -p $HOME/bin

créez un fichier

touch $HOME/bin/dorian

éditer avec

gedit $HOME/bin/dorian

et copier le texte suivant

#!/bin/bash

#**************************************************************************
NOM_LOGICIEL="${0##*/}"
FONCTION="Dorian...
va nous aider à ranger des fichiers contenus dans un dossier
son principe de fonctionnement repose sur les extensions de fichier.

En fonction de l'extension, Dorian va alimenter une base personnelle et créera un dossier 
que chacun pourra choisir lors de la première découverte de l'extension.

Si le fichier ne comporte pas d'extension Dorian se contente de le ranger par Type Mime et 
créera donc des dossiers et sous dossiers en fonction des types Mime trouvés
"
VERSION="0.003"
#NOTES DE VERSIONS
#----------------------------------------------
#
#----------------------------------------------
#echo "lancement ${NOM_LOGICIEL}..."

#**************************************************************************

#INITIALISATION DES VARIABLES

#durée d'exécution pour horodatage du log
START=$(date +%s.%N)

#DIR_CONF
DIR_CONF="${HOME}/.config/kholo/${NOM_LOGICIEL}"
# Création du dossier si il n'existe pas
[ -d "${DIR_CONF}" ] || mkdir -p "${DIR_CONF}"

FICHIER_LOG="${DIR_CONF}/${NOM_LOGICIEL}.log"

FILE_EXT_CONNUES="${DIR_CONF}/extConnues.txt"
# Création du fichier si il n'existe pas
[ -f "${FILE_EXT_CONNUES}" ] || > "${FILE_EXT_CONNUES}"

#DIR_ORIG
DIR_ORIG=""

#DIR_DEST
DIR_DEST=""

LES_EXT_CONNUES=()
LES_NOMS_DOSSIERS=()

#**************************************************************************

#ETAGE JOURNAL
function _journal () {
	#on vide le log ou on le crée si il n'existe pas
	> "${FICHIER_LOG}"
	journal "ouverture - $(date)"
	journal "Ligne ${LINENO}--\t\t------------------------"
	}
function journal () {
	local NOW=$(date +%s.%N)
	local DIFF=$(echo "${NOW} - ${START}" | bc)
	echo -e "[${DIFF}] ${@}" >> "${FICHIER_LOG}"
	#echo -e "${@}" >> "${FICHIER_LOG}"
	}
_journal

journal "Ligne ${LINENO}--\t\t\tchargement"
#**************************************************************************

#CHARGEMENT DES BASES
function nettoyerFichier () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	#ranger Fichier Dans Ordre Alpha et supprimer lignes vides

	#range les lignes d'un fichier dans l'ordre alphabétique
	sort -d -f -b -u "${@}" | tee "${@}.new" && mv "${@}.new" "${@}" 

	#supprime les lignes vides d'un fichier
	sed -i '/^$/d' "${@}"
	}
function chargerEXT_CONNUES () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	#Initialisation des bases
	LES_EXT_CONNUES=()
	LES_NOMS_DOSSIERS=()
	#Chargement des bases
	local LIGNE
	for LIGNE in $(cat "${FILE_EXT_CONNUES}")
	do
		LES_EXT_CONNUES+=( ${LIGNE%%;*} )
		LES_NOMS_DOSSIERS+=( ${LIGNE##*;} )
	done
	}

nettoyerFichier "$FILE_EXT_CONNUES" >/dev/null
chargerEXT_CONNUES

journal "Ligne ${LINENO}--\t\t	chargement"
#**************************************************************************

#Fonctions générales
function msgbox () {
	zenity --info --text "$@"
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

#Rangement par type Mine en cas de manque d'extension
function getTYPE_MIME_FICHIER () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	local CHEMIN_FICHIER="$1"

	local LE_TYPE_MIME="$(file -b -i "${CHEMIN_FICHIER}")"
	if [ $? -eq 1 ]
	then 
		journal "Ligne ${LINENO}--\t\t------------\nPROBLEME : \n${PWD} \n${CHEMIN_FICHIER} \n${LE_TYPE_MIME}\n-------------"
	else
		journal "Ligne ${LINENO}--\t\t${CHEMIN_FICHIER} \n->${LE_TYPE_MIME}" 

		TYPE_MIME_partie1="${LE_TYPE_MIME%%; *}"
		# TYPE_MIME_partie2="${LE_TYPE_MIME##*; }"

		echo "${TYPE_MIME_partie1}"

		# TYPE[1]="${TYPE_MIME_partie1%%/*}"
		# TYPE[2]="${TYPE_MIME_partie1##*/}"
		# TYPE[3]="${TYPE_MIME_partie2%%=*}"
		# TYPE[4]="${TYPE_MIME_partie2##*=}"
		# 
		# echo "${TYPE[$2]}"
	fi
	journal "Ligne ${LINENO}--\t\tfin du découpage TYPE_MIME"
	}
function rangerFichierParTypeMime () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	local CHEMIN_FICHIER="${@}"
	local LE_DOSSIER="0_$(getTYPE_MIME_FICHIER "${@}" 1)"
	journal "Ligne ${LINENO}--\t\tdéplacement de \n${CHEMIN_FICHIER} \nvers \n${DIR_DEST}/${LE_DOSSIER}"
	deplacerFichier "${CHEMIN_FICHIER}" "${DIR_DEST}/${LE_DOSSIER}"
	}
journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************
function deplacerFichier () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	local unFichier
	local uneDestination
	unFichier="${1}"
	uneDestination="${2}"
	journal "Ligne ${LINENO}--\t\tunFichier : ${unFichier}"
	journal "Ligne ${LINENO}--\t\tuneDestination : ${uneDestination}/"
	[ -d "${uneDestination}" ] || mkdir -p "${uneDestination}" && \
		journal "Ligne ${LINENO}--\t\tcréation dossier ${uneDestination} réussie"
	mv "${unFichier}" "${uneDestination}/" && \
		journal "Ligne ${LINENO}--\t\tdéplacement réussi" || \
		journal "Ligne ${LINENO}--\t\tdéplacement échec"
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

#ETAGE TRAITEMENT SELON EXTENSION
function frm_EntryChoixType {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	zenity --entry \
		--title="Choisir un type" \
		--text="l'extension ${@} n'a pas été trouvée ; \najouter aux motifs de type :" \
		--entry-text=$(echo "${LES_NOMS_DOSSIERS[@]}" | tr ' ' '\n' | sort -u)
	}
function ajouterMotifExtension () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"

	Nouveau_Dossier="$(frm_EntryChoixType "${1}")"
	# if [ ${#Nouveau_Dossier} -gt 0 ] 
	# then
		journal "Ligne ${LINENO}--\t\t# Ajouter aux extensions connues ${@};${Nouveau_Dossier}"
		erreur=0
		[ ${#@} -eq 0 ] && erreur=1
		[ ${#Nouveau_Dossier} -eq 0 ] && erreur=1
		if [ ${erreur} -eq 0 ] 
		then
			echo "${@};${Nouveau_Dossier}" | tee -a "${FILE_EXT_CONNUES}"

			LES_EXT_CONNUES+=( ${@} )
			LES_NOMS_DOSSIERS+=( ${Nouveau_Dossier} )

		else
			return 1
		fi
	# else
		# journal "Ligne ${LINENO}--\t\tnewMotifExt = ${Nouveau_Dossier}" # TODO ?
		# return 1
	# fi
	}
function chercherExtdansDB () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	# recherche dans les extensions connues 
	# renvoie un dossier si trouvé sinon rien 
	local leTest="${@}" # c'est l'extension à tester
	journal "Ligne ${LINENO}--\t\t#LES_EXT_CONNUES : ${#LES_EXT_CONNUES[@]}"
	for (( c=0;c<${#LES_EXT_CONNUES[@]};c++ ))
	do
		# journal "Ligne ${LINENO}--\t\t${leTest} == ${LES_EXT_CONNUES[$c]} ?"
		if [[ "${leTest}" == "${LES_EXT_CONNUES[$c]}" ]] 
		then
			journal "Ligne ${LINENO}--\t\tOUI-extension trouvée : ${LES_NOMS_DOSSIERS[$c]}"
			echo "${LES_NOMS_DOSSIERS[$c]}"
			break
		# else
			# journal "Ligne ${LINENO}--\t\tNON"
			# return 1
		fi
	done
	}
function rangerFichiersParExtension () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	CHEMIN_FICHIER="${@}" ;
	NOM_FICHIER="${CHEMIN_FICHIER##*/}"
	EXT_FICHIER="${NOM_FICHIER##*.}" ;

	local leCHEMIN="$(chercherExtdansDB "${EXT_FICHIER}")"
	journal "Ligne ${LINENO}--\t\tleCHEMIN : ${leCHEMIN}"

	if [ "${#leCHEMIN}" -eq 0 ] 
	then
		journal "Ligne ${LINENO}--\t\textension inconnue"
		local NOUVEAU_DOSSIER="$(ajouterMotifExtension "${EXT_FICHIER}")"
		if [ ! ${#NOUVEAU_DOSSIER} -eq 0 ] 
		then
			NOUVEAU_DOSSIER="${NOUVEAU_DOSSIER##*;}"
			deplacerFichier "${CHEMIN_FICHIER}" "${DIR_DEST}/${NOUVEAU_DOSSIER}"

			# sleep 0.2
			nettoyerFichier "$FILE_EXT_CONNUES" >/dev/null 
			# sleep 0.2
			chargerEXT_CONNUES

		else
			journal "Ligne ${LINENO}--\t\tl'extension ne sera pas ajoutée"
		fi
	else
		journal "Ligne ${LINENO}--\t\tDéplacement du fichier selon extension"
		deplacerFichier "${CHEMIN_FICHIER}" "${DIR_DEST}/${leCHEMIN[$c]}"
	fi
	}
function traiterFichier () {
	journal "---------------------------------------------"
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	CHEMIN_FICHIER="$(readlink -f "${@}")"
	NOM_FICHIER="${CHEMIN_FICHIER##*/}"
	EXT_FICHIER="${NOM_FICHIER##*.}"
	if [ "${EXT_FICHIER}" == "${NOM_FICHIER}" ]
	then
		journal "Ligne ${LINENO}--\t\t-------------pas d'extension !-------------"
		rangerFichierParTypeMime "${CHEMIN_FICHIER}"
	else 
		journal "Ligne ${LINENO}--\t\tl'extension est ${EXT_FICHIER}"
		rangerFichiersParExtension "${CHEMIN_FICHIER}"
	fi
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

#Etage traitement des arguments du script
function setDIR_DEST () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	DIR_DEST="${DIR_ORIG}"
	}
function estLienDossierFichier () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	if [ -L "${@}" ]
	then 
		journal "error : $@ est un lien"
	else
		if [ -d "${@}" ]
		then 
			journal "error : $@ est un dossier"
		else
			if [ -f "${@}" ]
			then 
				traiterFichier "${@}"
			fi
		fi
	fi
	}
function traiterLesArguments () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	IFS=$'\n'
	local url
	for url in $@
	do
		journal "Ligne ${LINENO}--\t\turl : ${url}"
		# DIR_ORIG="${url}"
		DIR_ORIG="${url%/*}"
		setDIR_DEST
		estLienDossierFichier "${url}"
	done
	}
function voirArguments () {
	journal "Ligne ${LINENO}--\t\tfunction -> ${FUNCNAME[0]}"
	if [ ! ${#@} -eq 0 ] 
	then
		journal "Ligne ${LINENO}--\t\tNbre d'arguments trouvés : ${#@}"
		traiterLesArguments "$@"
	else
		journal "Ligne ${LINENO}--\t\tpas d'arguments trouvés"
		exit 65
	fi
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

# nautilus "${PWD}"
# nautilus "$HOME/.config/kholo"
# exit 0

IFS=$'\n'
voirArguments $@

journal "Ligne ${LINENO}--\t\tfermeture"
#**************************************************************************

exit 0

PARTIE 2
un lanceur pour nautilus (à adapter si vous avez choisi un autre dossier que $HOME/bin)

touch $HOME/.local/share/nautilus/scripts/dorian

puis on l'édite

gedit $HOME/.local/share/nautilus/scripts/dorian

et copiez le code suivant

#!/bin/bash

IFS=$'\n'
leCHEMIN="$HOME/bin/dorian"
"${leCHEMIN}" $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS

PARTIE 3
maintenant allez dans un dossier et sélectionnez des fichiers
puis clic droit / scripts / dorian
et donnez un nom de dossier chaque fois qu'une extension inconnue est trouvée
chaque fichier dont l'extension est identique sera rangé avec ses congénère
les fichiers sans extensions seront rangés par type mime dans un dossier commençant par 0type/nomdutype

PARTIE 4
le fichier de log et pour éditer le fichier de configuration des extensions :

nautilus "$HOME/.config/kholo

exemple de fichier de configuration :
NB ce fichier est mis à jour automatiquement si vous ajoutez des extensions durant un rangment

gedit "$HOME/.config/kholo/extConnues.txt
bin;programmes
bz2;compression
conf;scripts
db;bases
deb;scripts
doc;bureautique
exe;programmes
gif;images
gz;compression
html;texte
jp2;images
jpeg;photos
mid;musique
ods;bureautique
odt;bureautique
pdf;bureautique
php;scripts
png;images
py;scripts
sh;scripts
sql;bases
tgz;compression
txt;texte
xlsx;bureautique
xz;compression
zip;compression

Dernière modification par kholo (Le 18/08/2017, à 12:41)

Hors ligne

#2 Le 19/08/2017, à 10:53

kholo

Re : [TUTO Bash] rangement automatique fichiers par extension

v.0.007

#!/bin/bash
# nautilus "${PWD}" ; exit 0

#**************************************************************************
NOM_LOGICIEL="${0##*/}"
FONCTION="Dorian...
va nous aider à ranger des fichiers contenus dans un dossier
son principe de fonctionnement repose sur les extensions de fichier.

En fonction de l'extension, Dorian va alimenter une base personnelle et créera un dossier 
que chacun pourra choisir lors de la première découverte de l'extension.

Si le fichier ne comporte pas d'extension Dorian se contente de le ranger par Type Mime et 
créera donc des dossiers et sous dossiers en fonction des types Mime trouvés
"
VERSION="0.007"
#NOTES DE VERSIONS
#----------------------------------------------
#
# 0.007
# [ VS [[ à voir !
# 0.006
# nettoyage
# 0.005
# suppression des "function" 
# 0.004
# premiers tests et mises au point des fonctions
#----------------------------------------------
#echo "lancement ${NOM_LOGICIEL}..."

# zenity --info --text "${@}"
# exit 0

#**************************************************************************

#INITIALISATION DES VARIABLES

#durée d'exécution pour horodatage du log
START=$(date +%s.%N)

#DIR_CONF
DIR_CONF="${HOME}/.config/kholo/${NOM_LOGICIEL}"
# Création du dossier si il n'existe pas
[ -d "${DIR_CONF}" ] || mkdir -p "${DIR_CONF}"

FICHIER_LOG="${DIR_CONF}/${NOM_LOGICIEL}.log"

FILE_EXT_CONNUES="${DIR_CONF}/extConnues.txt"
# Création du fichier si il n'existe pas
[ -f "${FILE_EXT_CONNUES}" ] || > "${FILE_EXT_CONNUES}"

#DIR_ORIG
DIR_ORIG=""

#DIR_DEST
DIR_DEST=""

LES_EXT_CONNUES=()
LES_NOMS_DOSSIERS=()

#**************************************************************************

#ETAGE JOURNAL
_journal () {
	#journal cumulé
	[ -f "${FICHIER_LOG}" ] || > "${FICHIER_LOG}"

	#on vide le log ou on le crée si il n'existe pas
	# > "${FICHIER_LOG}"

	journal "ouverture - $(date)"
	journal "Ligne ${LINENO}--\t\t------------------------"
	}
journal () {
	local NOW=$(date +%s.%N)
	local DIFF=$(echo "${NOW} - ${START}" | bc)
	echo -e "[${DIFF}] ${@}" >> "${FICHIER_LOG}"
	}
_journal

journal "Ligne ${LINENO}--\t\t\tchargement"
#**************************************************************************

#CHARGEMENT DES BASES
nettoyerFichier () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"

	#range les lignes d'un fichier dans l'ordre alphabétique
	sort -d -f -b -u "${@}" | tee "${@}.new" && mv "${@}.new" "${@}"

	#supprime les lignes vides d'un fichier
	sed -i '/^$/d' "${@}"
	}
chargerEXT_CONNUES () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	#Initialisation des bases
	LES_EXT_CONNUES=()
	LES_NOMS_DOSSIERS=()
	#Chargement des bases
	local LIGNE
	for LIGNE in $(cat "${FILE_EXT_CONNUES}")
	do
		LES_EXT_CONNUES+=( ${LIGNE%%;*} )
		LES_NOMS_DOSSIERS+=( ${LIGNE##*;} )
	done
	}

nettoyerFichier "$FILE_EXT_CONNUES" >/dev/null
chargerEXT_CONNUES

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

#Rangement par type Mine en cas de manque d'extension
getTYPE_MIME_FICHIER () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	local CHEMIN_FICHIER="$1"

	local LE_TYPE_MIME="$(file -b -i "${CHEMIN_FICHIER}")"
	if [ $? -eq 1 ]
	then 
		journal "Ligne ${LINENO}--\t\t------------\nPROBLEME : \n${PWD} \n${CHEMIN_FICHIER} \n${LE_TYPE_MIME}\n-------------"
	else
		journal "Ligne ${LINENO}--\t\t${CHEMIN_FICHIER} \n->${LE_TYPE_MIME}" 
		TYPE_MIME_partie1="${LE_TYPE_MIME%%; *}"
		echo "${TYPE_MIME_partie1}"
	fi
	journal "Ligne ${LINENO}--\t\tfin du découpage TYPE_MIME"
	}
rangerFichierParTypeMime () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	local CHEMIN_FICHIER="${@}"
	local LE_DOSSIER="0_$(getTYPE_MIME_FICHIER "${@}" 1)"
	journal "Ligne ${LINENO}--\t\tdéplacement de \n${CHEMIN_FICHIER} \nvers \n${DIR_DEST}/${LE_DOSSIER}"
	deplacerFichier "${CHEMIN_FICHIER}" "${DIR_DEST}/${LE_DOSSIER}"
	}
journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************
deplacerFichier () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	local unFichier
	local uneDestination
	unFichier="${1}"
	uneDestination="${2}"
	journal "Ligne ${LINENO}--\t\tunFichier : ${unFichier}"
	journal "Ligne ${LINENO}--\t\tuneDestination : ${uneDestination}/"
	[ -d "${uneDestination}" ] || mkdir -p "${uneDestination}" && \
		journal "Ligne ${LINENO}--\t\tcréation dossier ${uneDestination} réussie"
	mv "${unFichier}" "${uneDestination}/" && \
		journal "Ligne ${LINENO}--\t\tdéplacement réussi" || \
		journal "Ligne ${LINENO}--\t\tdéplacement échec"
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

#ETAGE TRAITEMENT SELON EXTENSION
frm_EntryChoixType () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	zenity --entry \
		--title="Choisir un type" \
		--text="l'extension ${@} n'a pas été trouvée ; \najouter aux motifs de type :" \
		--entry-text=$(echo "${LES_NOMS_DOSSIERS[@]}" | tr ' ' '\n' | sort -u)
	}
ajouterMotifExtension () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"

	Nouveau_Dossier="$(frm_EntryChoixType "${1}")"
	# if [ ${#Nouveau_Dossier} -gt 0 ] 
	# then
		journal "Ligne ${LINENO}--\t\t# Ajouter aux extensions connues ${@};${Nouveau_Dossier}"
		if [ ${#@} -ne 0 ] && [ ${#Nouveau_Dossier} -ne 0 ]
		then
			echo "${@};${Nouveau_Dossier}" | tee -a "${FILE_EXT_CONNUES}"

			LES_EXT_CONNUES+=( ${@} )
			LES_NOMS_DOSSIERS+=( ${Nouveau_Dossier} )

		else
			return 1
		fi
	# else
		journal "Ligne ${LINENO}--\t\tnewMotifExt = ${Nouveau_Dossier}" # TODO ?
		# return 1
	# fi
	}
chercherExtdansDB () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"

	# recherche dans les extensions connues 
	# renvoie un dossier si trouvé sinon rien 
	local leTest="${@}" # c'est l'extension à tester
	journal "Ligne ${LINENO}--\t\t#LES_EXT_CONNUES : ${#LES_EXT_CONNUES[@]}"
	for (( c=0;c<${#LES_EXT_CONNUES[@]};c++ ))
	do
		# journal "Ligne ${LINENO}--\t\t${leTest} == ${LES_EXT_CONNUES[$c]} ?"
		if [[ "${leTest}" == "${LES_EXT_CONNUES[$c]}" ]] 
		then
			journal "Ligne ${LINENO}--\t\tOUI extension trouvée : ${LES_NOMS_DOSSIERS[$c]}"
			echo "${LES_NOMS_DOSSIERS[$c]}"
			break
		# else
			# journal "Ligne ${LINENO}--\t\tNON"
		fi
	done
	}
rangerFichiersParExtension () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	CHEMIN_FICHIER="${@}" ;
	NOM_FICHIER="${CHEMIN_FICHIER##*/}"
	EXT_FICHIER="${NOM_FICHIER##*.}"

	local leCHEMIN="$(chercherExtdansDB "${EXT_FICHIER}")"
	journal "Ligne ${LINENO}--\t\tleCHEMIN : ${leCHEMIN}"

	if [ "${#leCHEMIN}" -eq 0 ] 
	then
		journal "Ligne ${LINENO}--\t\textension inconnue"
		local NOUVEAU_DOSSIER="$(ajouterMotifExtension "${EXT_FICHIER}")"
		if [ ! ${#NOUVEAU_DOSSIER} -eq 0 ] 
		then
			NOUVEAU_DOSSIER="${NOUVEAU_DOSSIER##*;}"
			deplacerFichier "${CHEMIN_FICHIER}" "${DIR_DEST}/${NOUVEAU_DOSSIER}"
			nettoyerFichier "$FILE_EXT_CONNUES" >/dev/null
			chargerEXT_CONNUES
		else
			journal "Ligne ${LINENO}--\t\tl'extension ne sera pas ajoutée"
		fi
	else
		journal "Ligne ${LINENO}--\t\tDéplacement du fichier selon extension"
		deplacerFichier "${CHEMIN_FICHIER}" "${DIR_DEST}/${leCHEMIN[$c]}"
	fi
	}
traiterFichier () {
	journal "Ligne ${LINENO}--\t\t----------------------------------"
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	CHEMIN_FICHIER="$(readlink -f "${@}")"
	NOM_FICHIER="${CHEMIN_FICHIER##*/}"
	EXT_FICHIER="${NOM_FICHIER##*.}"
	if [ "${EXT_FICHIER}" == "${NOM_FICHIER}" ]
	then
		journal "Ligne ${LINENO}--\t\t-------------pas d'extension !-------------"
		rangerFichierParTypeMime "${CHEMIN_FICHIER}"
	else 
		journal "Ligne ${LINENO}--\t\tl'extension est ${EXT_FICHIER}"
		rangerFichiersParExtension "${CHEMIN_FICHIER}"
	fi
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

#Etage traitement des arguments du script
setDIR_DEST () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	DIR_DEST="${DIR_ORIG}"
	}
estLienDossierFichier () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	if [ -L "${@}" ]
	then 
		journal "error : $@ est un lien"
	else
		if [ -d "${@}" ]
		then 
			journal "error : $@ est un dossier"
		else
			if [ -f "${@}" ]
			then 
				# DIR_ORIG="${@}"
				DIR_ORIG="${@%/*}"
				setDIR_DEST
				traiterFichier "${@}"
			fi
		fi
	fi
	}
traiterLesArguments () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	# journal "Ligne ${LINENO}--\t\tArguments -> ${@}"
	IFS=$'\n'
	local url
	for url in $@
	do
		journal "---------------------------------------------"
		journal "Ligne ${LINENO}--\t\turl : ${url}"
		estLienDossierFichier "${url}"
	done
	}

selectionnerTousLesFichiers () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	for FILE in *
	do
		if [ -e "$(readlink -f "${FILE}")" ] 
		then
			estLienDossierFichier "$(readlink -f "${FILE}")"
		else
			journal "erreur avec ${FILE}"
		fi
	done
	}
afficher_ExtConnues () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	cat "${FILE_EXT_CONNUES}"
	echo -e "le fichier est : ${FILE_EXT_CONNUES}"
	exit  66
	}
afficher_fichier_log () {
	cat "${FICHIER_LOG}"
	echo -e "le fichier est : ${FICHIER_LOG}"
	exit  67
	}
vider_fichier_log () {
	>"${FICHIER_LOG}"
	echo -e "le fichier est vidé : \n${FICHIER_LOG}"
	exit  67
	}
afficher_aide () {
cat <<EOF 
dorian va nous aider à ranger nos fichiers
lancez dorian [Ff:hHvVcl]

dorian -h ou -H 
	cette aide
dorian -v ou -V 
	la version de ce script
dorian -F 
	range tous les fichiers trouvés dans le répertoire courant
dorian -f  'un Fichier'
	range 'un Fichier' mettre -f pour chaque fichier
dorian "/un/fichier/ici" "/un/fichier/la"
	liste de fichiers séparés par des sauts de ligne ou des espaces
dorian -c 
	affiche le fichier des extentions de l'utilisateur courant et son emplacement.
dorian -l 
	affiche le fichier log de l'utilisateur courant et son emplacement.
EOF
	afficher_version
	}
afficher_version () {
	echo "$0 version : $VERSION"
	}
traiterLesOptions () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	while getopts cFf:hHlvV option # : pour dire que l'option attend un argument
	do
		case "${option}" in
			c ) afficher_ExtConnues ;;
			F ) selectionnerTousLesFichiers ;;
			f ) [ -e "$(readlink -f "${OPTARG}")" ] && estLienDossierFichier "$(readlink -f "${OPTARG}")" ;;
			h | H ) afficher_aide ;;
			l ) afficher_fichier_log ;;
			L ) vider_fichier_log ;;
			v | V ) afficher_version ;;

		esac
	done
	shift $(($OPTIND-1))

	[ -n $1 ] && journal "Ligne ${LINENO}--\t\tje n'ai pas traité cela : ${@}"
	}
voirArguments () {
	journal "Ligne ${LINENO}--\t\t-> ${FUNCNAME[0]}"
	if [ ! ${#@} -eq 0 ] 
	then
		journal "Ligne ${LINENO}--\t\tNbre d'arguments trouvés : ${#@}"
		case $@ in
			-* ) traiterLesOptions "$@" ;;
			*) traiterLesArguments "$@" ;;
		esac
	else
		journal "Ligne ${LINENO}--\t\tpas d'arguments trouvés"
		afficher_aide
		echo "erreur 65 ; arguments manquants"
		exit 65
	fi
	}

journal "Ligne ${LINENO}--\t\tchargement"
#**************************************************************************

# nautilus "${PWD}"
# nautilus "$HOME/.config/kholo"
# exit 0

IFS=$'\n'
voirArguments $@

journal "---------------------------------------------
Ligne ${LINENO}--\t\tfermeture"
#**************************************************************************

exit 0

Hors ligne