Optimisation d'un script bash

Iaorana à tou(te)s,

Je ne sais pas si je poste au bon endroit mais je cherche à optimiser un script bash me permettant de ranger mes fichiers films par réalisateurs.

J’ai tenté de le faire le plus complet possible avec des contrôles me paraissant nécessaires

Merci à vous pour toutes vos éventuelles remarques.


#!/bin/bash
# lecture aleatoire de fichiers pour traitement vers repertoires finaux

### VARIABLES ###
ARGUMENT_VERBEUX_SHORT="-v"
ARGUMENT_VERBEUX_LONG="--verbose"
ARGUMENT_IN_SHORT="-i"
ARGUMENT_IN_LONG="--in"
ARGUMENT_IN=""
ARGUMENT_OUT_SHORT="-o"
ARGUMENT_OUT_LONG="--out"
ARGUMENT_OUT=""
ARGUMENT_OUT_CREA_SHORT="-c"
ARGUMENT_OUT_CREA_LONG="--create"
DEFAULT_RANGEMENT_NAME="rangement/" ## ATTENTION a ne pas oublier le slash en fin
LECTEUR_MEDIA="mplayer"
OPTIONS_LECTEUR="-framedrop -really-quiet -osdlevel 3 -fs -zoom"

CORE2="ClintE DannyB StevenS TonyS RidleyS GeorgesL Tolkien JohnC "
CORE3="hs covers"

# Mise en forme Couleur de base
RESETC="$(tput sgr0)"
RED="$(tput bold ; tput setaf 1)"
GREEN="$(tput bold ; tput setaf 2)"
YELLOW="$(tput bold ; tput setaf 3)"
BLUE="$(tput bold ; tput setaf 4)"

usagehelp () {
	local NAMEfichier=$(basename "$0")
#	local MSG_ERREUR_COMPLEMENTAIRE="$1"
	echo "${YELLOW}Usage :${RESETC} $NAMEfichier [${ARGUMENT_VERBEUX_SHORT} | ${ARGUMENT_VERBEUX_LONG}] [${ARGUMENT_IN_SHORT} | ${ARGUMENT_IN_LONG}] repertoire_source [${ARGUMENT_OUT_SHORT} | ${ARGUMENT_OUT_LONG}] repertoire_organisation [$ARGUMENT_OUT_CREA_SHORT | $ARGUMENT_OUT_CREA_LONG] [nom_repertoire_de_rangement]

 $NAMEfichier lance${GREEN} $LECTEUR_MEDIA ${RESETC}sur les fichiers pris en charge du repertoire source et propose un choix de mouvement vers les sous-repertoires du repertoire d'organisation.
[-c | --create] [nom_du_repertoire_de_rangement] cree une structure de repertoires de rangement dans le repertoire d'organisation place en argument sinon utilise $DEFAULT_RANGEMENT_NAME par defaut"
#${RESETC} $NAMEfichier ${YELLOW}[repertoire_source]${RESETC} (devant contenir le repertoire $NAMEfolder)] | si absent -> mode interactif | repertoire courant"
	echo "$2"
	exit $1
}

#controle lecteur media
[[ ! -x `/usr/bin/whereis -b $LECTEUR_MEDIA | tr " " "n" | grep bin/ | head -n 1` ]] && usagehelp 2 "verifier la presense de $LECTEUR_MEDIA"

# boucle pour detecter les arguments du mode verbeux dans la ligne de commande
for arg in "$@"
do
[ "$arg" = "$ARGUMENT_VERBEUX_SHORT"  -o "$arg" = "$ARGUMENT_VERBEUX_LONG" ] && ARGUMENT_VERBEUX="-v"
done

# different controle du premier argument
[ "$1" = "$ARGUMENT_VERBEUX_SHORT"  -o "$1" = "$ARGUMENT_VERBEUX_LONG" ] && shift
[ "$1" = "-h"  -o "$1" = "--help" ] && usagehelp 0

# controle et enregistrement argument n°1
if [ "$1" = "$ARGUMENT_IN_SHORT"  -o "$1" = "$ARGUMENT_IN_LONG" ] ; then
	[[ ! -d "$2" ]] && usagehelp 2
	ARGUMENT_IN=$2
else
	usagehelp 2
fi
#controle et enregistrement argument n°3
if [ "$3" = "$ARGUMENT_OUT_SHORT"  -o "$3" = "$ARGUMENT_OUT_LONG" ] ; then
	[[ ! -d "$4" ]] && usagehelp 2 "$4 ne semble pas etre un repertoire"
	[[ ! -w "$4" ]] && usagehelp 2 "verifier les droits en ecriture sur $4"
	ARGUMENT_OUT=$4
else
	usagehelp 2
fi

#controle et enregistrement argument n°5
if [ "$5" = "$ARGUMENT_OUT_CREA_SHORT" -o "$5" = "$ARGUMENT_OUT_CREA_LONG" ] ; then
# verification et annulation du slash eventuel du 4eme argument
	[[ ! `echo $ARGUMENT_OUT | grep /$` ]] && ARGUMENT_OUT="$4/"
# presence argument 6 et repertoire ou pas en evitant l'eventuelle presence de l'argument du mode verbeux
	if  [ "$6" = "" -o "$6" = "$ARGUMENT_VERBEUX_SHORT" -o "$6" = "$ARGUMENT_VERBEUX_LONG" ] ; then
		CORE1="$DEFAULT_RANGEMENT_NAME"
	else
		CORE1="$6"
	fi
	[[ ! `echo $CORE1 | grep /$` ]] && CORE1="$6/"
	CORE="$CORE2$CORE3"
# creation repertoire pere rangement
	mkdir ${ARGUMENT_VERBEUX} $ARGUMENT_OUT$CORE1
	VALEUR_MKDIR=`echo $?`
	[[ $VALEUR_MKDIR -eq 0 ]] && ARGUMENT_OUT="$ARGUMENT_OUT$CORE1" || usagehelp 2
# affichage verbeux si demande en argument
	[[ $ARGUMENT_VERBEUX ]] && echo "[mode creation] $CORE1 a bien ete pris en compte pour le nom du repertoire de rangement"
	
	DECREMENT=1
# tableau pour la creation des repertoires fils rangement
	for i in $(echo "$CORE" | tr " " "n") ; do
		REP_RANGEMENT[$DECREMENT]="$i"
		mkdir $ARGUMENT_VERBEUX "$ARGUMENT_OUT${REP_RANGEMENT[$DECREMENT]}"
		DECREMENT=$(( $DECREMENT + 1 ))
	done
fi

### etape 2 : liste des repertoires pour tri final #########
NB_FICHIERS_CONCERNES=`find "$ARGUMENT_IN" -maxdepth 1 -type f -size +2M | wc -l`
echo "${YELLOW} $NB_FICHIERS_CONCERNES ${RESETC}fichier(s) concerne(s)"
until [ $NB_FICHIERS_CONCERNES -lt 1 ]
### boucle de lecture des fichiers ###
do
### etape 3 : lecture aleatoire fichier ####################
	NB_ALEATOIRE=`echo $(($RANDOM%NB_FICHIERS_CONCERNES))`
# correction du nombre aleatoire pour ne pas avoir le 0
	NB_ALEATOIRE=`echo $(( $NB_ALEATOIRE + 1 ))`
	FICHIER_MEDIA="$(find "$ARGUMENT_IN" -maxdepth 1 -type f -size +2M -print | tail -n +$NB_ALEATOIRE | head -1)"
# affichage nom de fichier lu
	echo "${YELLOW} $FICHIER_MEDIA${RESETC}"
# lecture
	$LECTEUR_MEDIA $OPTIONS_LECTEUR "$FICHIER_MEDIA" 2>/dev/null

### etape 4 : choix du rangement ###########################
	NB_REP_RANGEMENT=$(find "$ARGUMENT_OUT" -maxdepth 1 -type d | awk -F"/" '{print $NF}' | grep -v  -e "^$" -e "^ *#" | wc -l)
# compteur place direct sur 1 pour faciliter lecture tableau et choix de selection
	DECREMENT=1
### boucle d'affichage des repertoires ###
	until [ $DECREMENT -gt $NB_REP_RANGEMENT ]
	do
# enregistrement des repertoires de rangement dans une variable tableau
		REP_RANGEMENT[$DECREMENT]=$(find "$ARGUMENT_OUT" -maxdepth 1 -type d | awk -F"/" '{print $NF}' | grep -v  -e "^$" -e "^ *#" | head -n +$DECREMENT| tail -1)
		DECREMENT=$(( $DECREMENT + 1 ))
	done ### fin boucle d'affichage des repertoires ###
# nombre de repertoires +1 dans variable sommet
	TOP_NB_REP_RANGEMENT=$(( ${#REP_RANGEMENT[*]} + 1 ))
#echo "${RED}$NB_REP_RANGEMENT${RESETC}"
	COMPTEUR_TAB=1
### boucle d'affichage des repertoires ###
	until [ $COMPTEUR_TAB -gt ${#REP_RANGEMENT[*]} ]
	do
		echo "${YELLOW}$COMPTEUR_TAB${RESETC} - ${YELLOW}${REP_RANGEMENT[$COMPTEUR_TAB]}${RESETC}"
		COMPTEUR_TAB=`echo $(( $COMPTEUR_TAB + 1 ))`
	done ### fin boucle d'affichage des repertoires ###

	read -p "
${BLUE}$TOP_NB_REP_RANGEMENT${RESETC} - ${BLUE}relecture${RESETC}

${RED}0${RESETC} - ${RED}trash${RESETC}
${GREEN}q|Q${RESETC} - ${GREEN}quit${RESETC}
Choisis et valide. " CHOIX
	case $CHOIX in
        q|Q)
            exit 0;;
		0)
			echo "/bin/rm -vi $FICHIER_MEDIA"
			;;
# variable sommet pour relecture
		$TOP_NB_REP_RANGEMENT)
			$LECTEUR_MEDIA $OPTIONS_LECTEUR "$FICHIER_MEDIA" 2>/dev/null
			echo "relecture de $FICHIER_MEDIA ${YELLOW}n'est PAS traite${RESETC}
... traitement de cet inconvenient en projet. bye"
			exit 0;;
		[1-9]*)
			/bin/mv -vi "$FICHIER_MEDIA" "$ARGUMENT_OUT${REP_RANGEMENT[$CHOIX]}";;
        *)
            echo " Choix non valide"
        esac
# correction du nombre de fichiers dans le repertoire apres un eventuel deplacement ou effacement
	NB_FICHIERS_CONCERNES=`find "$ARGUMENT_IN" -maxdepth 1 -type f -size +2M | wc -l`
	done
exit 0

QU’est ce que tu veux “optimiser”??

J’ai l’impression que mon code est trop long.
Il doit y avoir des commandes plus simples comme l’imbrication des find dans le until ou les appels de variables.

Je lis mais je ne trouve pas encore comment réduire le code.