Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.
nombre réponses : 25

#0 Re : -1 »  [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...) » Le 30/09/2011, à 06:25

nassertom
Réponses : 1734

Bonjour,

J'ai fait ce script pour convertir des vidéos mkv en avi. la particularité de ce script est qu'il sélectionne automatiquement la langue française pour le fichier avi.
de plus pour les gens qui ont pas mal de fichier celui-ci vérifie la présence ou non du fichier avant de le ripper.

il effectue une recherche récursive dans le répertoire source (celui qui contient les mkv) ainsi que dans le répertoire cible (celui qui contient les avi)

J'ai fait cela cette nuit donc il est perfectible et si vous avec des propositions d'amélioration je suis preneur.
par exemple je n'ai pas réussi à lancer 2 conversions en simultané automatiquement et pour ce faire je lance 2 fois le scripts pour ripper 2 fichiers en même temps.
car les codecs que j'utilise via ffmpeg ne pas optimisé pour faire du multi-threads donc quite à travailler que sur un cœur autant lancer 2 scripts.

#!/bin/bash

if [ $# != 2 ] # Test le nombres de paramètre passé au shell
then
    echo erreur dans la saisie des paramètres;
    echo "essayer : sh $0 /repertoire_source /repertoire_cible";
    exit 0 # Quitte le shell
elif [ ! -d "$1" -o ! -d "$2" ] # Test que les paramètres soient bien des repertoires
then
    echo il faut renseigner des répertoirs dans les paramètres;
    exit 0
fi
#Paramètres du shell
repertoirSource="${1%/}/" # Supprime le slash de la fin si il existe puis en ajoute un (pour éviter d'en avoir 2 si l'utilisateur l'avait mis)
repertoirCible="${2%/}/"
extension="mkv"
#Fichiers de log pour exploitation future
log="$repertoirCible"log.txt
existant="$repertoirCible"existant.txt
absent="$repertoirCible"absent.txt
erreur="$repertoirCible"erreur.txt

flag="non" #Drapeau pour communiquer entre les fonctions
maintenant=$(date) #Pour afficher l'heure et la date dans le fichier de log

#Fonction pour mettre à jour la date et heure dans la variable.
actualiseTimeOfTreatment() {
    maintenant=$(date '+%Y-%m-%d %H:%M:%S')
}
#Fonction métier besoin de ripper des fichiers mkv en avi avec une selection automatique de la langue francaise si présente
actionMKVtoAVI() {
    fichier="${1##*/}" #Récupération du nom de fichier passé en paramètre (idem que d'utiliser basename)
    echo "${maintenant};${1};demande de conversion." >> "$log";
        # recherche le mapping des pistes audio FR via la commande ffmpeg -i
        # redirection de la sortie 2 vers la 1 car ffmpeg n'affiche pas les informations à l'écran via la sortie standard.
        # recuperation du resultat de grep dans la variable.
    audio=`ffmpeg -i  "$1" 2>&1| grep '(fre): Audi'`
        # supprime de la variable 'Stream #' ainsi que tous ce qui le precede.
    audio="${audio##*Stream #}"
        # supprime de la variable '(fre)' et tous ce qui suit
    audio=${audio%(fre)*}
        # la variable contien à ce moment là soit le mappage attendu pour le francais (ex: '0.1') soit rien
        # même principe pour le mappage de la vidéo car pour mapper en manuel dans ffmpeg il faut lui donner l'ensemble des flux.
        # recherche le mapping de la video via la commande ffmpeg -i
    video=`ffmpeg -i  "$1" 2>&1| grep ': Video'`
    video="${video##*Stream #}"
    video=${video%%(*}
        # si piste audio FR détecté alors force le map dans la conversion.
        # pas de test sur la variable vidéo car en cas d'erreur c'est ffmpeg qui prendra en charge de mapper automatiquement la première piste vidéo.
    if ["${audio}" -e ""]
    then
        echo "${maintenant};${1};Pas de piste audio française trouvée." >> "$log";
        echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi ${repertoirCible}${fichier%.*}.avi" >> "$log";
        ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi "${repertoirCible}${fichier%.*}".avi;
    else
        echo "${maintenant};${1};Piste audio française trouvée." >> "$log";
        echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map ${video} -map ${audio} -ac 2 -v 0 -f avi ${repertoirCible}${fichier%.*}.avi;" >> "$log";
        ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map "${video}" -map "${audio}" -ac 2 -v 0 -f avi "${repertoirCible}${fichier%.*}".avi;
    fi 
}
actionScript() {
actualiseTimeOfTreatment #demande de mise à jour de la variable temps (maintenant)
if [ "$flag" = "non" ] #Si fichier non trouvé
    then     
        echo "$1" >> "$absent";
        actionMKVtoAVI "$1"
    else    #Si fichier trouvé    
        echo "${maintenant};${1};${flag}" >> "$log" ;
        echo "$1" >> "$existant";
    fi 
    return
}
rechercheCible() { #Dans le cas des boucles for le résultat d'un repertoir n'est pas fini par un '/' c'est pourquoi je l'ajoute apres ${u}"/"
    for u in "$1"* ;do  #Boucle sur tout le contenu du repertoir passé en paramètre
        if [ -d "$u" ] #Si repertoire
        then
            if [ -f "${u}"/"$2" ] #si le fichier existe dans le répertoire 
            then
                flag="${u}"/"$2"  #valorise le flag pour dire que le fichier est présent                    
                return  #quitte la fonction
            else
                rechercheCible "${u}/" "$2" #sinon explore le contenu de ce nouveau répértoire
            fi
        fi
    done
    return #Si je sorts ici alors c'est que je n'ai rien trouvé...
}
rechercheSource() {
    for i in "$1"* ;do #Boucle sur l'ensemble des fichiers 
        flag="non" #Passe le drapeau à non avant de faire la recherche dans le repertoire cible
        if [ -d "$i" ] #Si repetoire
        then 
            rechercheSource "${i}/"  #Recherche dans le sous répertoire
        else
            currentExtension="${i##*.}" #Extraction de l'extension
            nom="${i##*/}"    #extraction du nom de fichier        
            if [ "$currentExtension" = "${extension}" ]
            then    
                if [ -f "${repertoirCible}${nom%.*}".avi ] #si le fichier existe dans le répertoire cible
                then
                    flag="${repertoirCible}${nom%.*}".avi  #valorise le flag pour dire que le fichier est présent
                    actionScript "$i" #Demande l'execution d'une action    
                else
                    rechercheCible "$repertoirCible" "${nom%.*}".avi #recherche sa présence dans les sous répértoires Cible (apres avoir changé son extension)        
                    actionScript "$i" #Demande l'execution d'une action
                fi
            else
                echo "${maintenant};${1};n'est pas un fichier $extension">> "$log";
                echo "$i" >> "$erreur";
            fi
        fi
    done
    return
}

rechercheSource "$repertoirSource" 

echo "Job's done by Tom";

pour suivre en temps réel le traitement du script je fais

tail -f log.txt

#1 Re : -1 »  [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...) » Le 29/03/2013, à 05:49

nassertom
Réponses : 1734

Bonjour,

Je n'ai pas eu le courage de regarder toutes les pages alors désolé si c'est un doublon.

voici le script que j'utiliser pour faire le ménage sur mon NAS

#!/bin/bash
if [ $# != 1 ] # Test le nombres de paramètre passé au shell
then
	echo Tapez oui si vous voulez lancer le clean;
	exit 0 # Quitte le shell
elif [ "$1" != "oui" ] # Test si l'utilisateur a tapé oui
then
	echo il faut taper oui en minuscule;
	exit 0
fi

#Paramètres du shell
UserValue="._* *.DS_Store Thumbs.db desktop.ini"

  for i in $UserValue
  do
    	echo "Suppression des fichiers : $i"
	find ./ -name "$i" -delete
  done
echo Le traitement est terminé;

Cordialement,
Thomas R

#2 Re : -1 »  [ VOS SCRIPTS UTILES ] (et eventuelles demandes de scripts...) » Le 29/03/2013, à 06:12

nassertom
Réponses : 1734

re bonjour,

voici les scripts que j'utilise pour faire la conversion à la volé de vidéo.
je sais que ce type de script est en abondance sur le réseau cependant je n'ai jamais trouvé mon bonheur.

en quelques mots :
- traitement en masse
- répertoire source vers cible
- choix de l'extension source
- selection du français pour les sources avec plusieurs pistes audio
- choix du nombre de conversion à faire en simultané
- vérification de la présence des fichiers avant la conversion (en cas de traitement en plusieurs lot...)
- création de plusieurs fichiers de log (fichier erreur, réussi, log... => le but pour moi est de faire un tail -f sur le log de mon choix durant l'execution)

le fonctionnement est le suivant : un script est appelé avec comme paramètre le nombre de thread (je sais que ce n'est pas un vrai thread...) l'extension cherché, le répertoire source puis la cible

ce script va appelé un autre script (l'évolution aurait été de s'appelé soit même en récursif!! je suis trop fainéant pour le faire en ce moment lol)

si le fichier à convertir existe déjà en avi dans l'arborescence cible alors la conversion n'est pas faite (et la log des fichiers déjà présent est valorisé)
place au code :
le script à appeler

#!/bin/bash
if [ $# != 4 ] # Test le nombres de paramètre passé au shell
then
	echo erreur dans la saisie des paramètres;
	echo "essayer : sh $0 nbTread /repertoire_source /repertoire_cible extension";
	exit 0 # Quitte le shell
elif [ ! -d "$2" -o ! -d "$3" ] # Test que les paramètres soient bien des repertoires
then
	echo il faut renseigner des répertoirs dans les paramètres;
	exit 0
fi

#Paramètres du shell
repertoirSource="${2%/}/" # Supprime le slash de la fin si il existe puis en ajoute un (pour éviter d'en avoir 2 si l'utilisateur l'avait mis)
repertoirCible="${3%/}/"
extension="${4}"
UserValueThread=$1

  # start threads
  for i in $(seq 1 $UserValueThread)
  do
    	echo "started instance no: $i"
  	./filesToAvi.sh $repertoirSource $repertoirCible $extension true &

 	sleep 2
  done

le second script qui se nomme filesToAvi.sh

#!/bin/bash

if [ $# != 4 ] # Test le nombres de paramètre passé au shell
then
	echo erreur dans la saisie des paramètres;
	echo "essayer : sh $0 /repertoire_source /repertoire_cible extension true/false";
	echo "true veut dire création de l'arboréssence de la source vers la cible";
	exit 0 # Quitte le shell
elif [ ! -d "$1" -o ! -d "$2" ] # Test que les paramètres soient bien des repertoires
then
	echo il faut renseigner des répertoirs dans les paramètres;
	exit 0
fi
#Paramètres du shell
repertoirSource="${1%/}/" # Supprime le slash de la fin si il existe puis en ajoute un (pour éviter d'en avoir 2 si l'utilisateur l'avait mis)
repertoirCible="${2%/}/"
extension="${3}"
creatFolder="${4}"
cible="${repertoirCible}"
#Fichiers de log pour exploitation future
log="$repertoirCible"log.txt
existant="$repertoirCible"existant.txt
absent="$repertoirCible"absent.txt
erreur="$repertoirCible"erreur.txt

flag="non" #Drapeau pour communiquer entre les fonctions
maintenant=$(date) #Pour afficher l'heure et la date dans le fichier de log
#Fonction pour mettre à jour le repertoire à créer
actualiseRepertoireCible(){
if [ $creatFolder = "true" ] # si je dois reproduire l'arboressence
cible=$(echo "${1}"|sed "s#${repertoirSource}#${repertoirCible}#g") # remplace le repertoire source par la cible
cible="${cible%/}/"
then
	if [ ! -d "${cible}" ] # Test si le repertoire existe
	then 
	# si il n'existe pas alors je le cré
	mkdir -p "${cible}"
	fi
fi
}
#Fonction pour mettre à jour la date et heure dans la variable.
actualiseTimeOfTreatment() {
	maintenant=$(date '+%Y-%m-%d %H:%M:%S')
}
#Fonction métier besoin de ripper des fichiers mkv en avi avec une selection automatique de la langue francaise si présente
actionMKVtoAVI() {
	fichier="${1##*/}" #Récupération du nom de fichier passé en paramètre (idem que d'utiliser basename)
	echo "${maintenant};${1};demande de conversion." >> "$log";
		# recherche le mapping des pistes audio FR via la commande ffmpeg -i
		# redirection de la sortie 2 vers la 1 car ffmpeg n'affiche pas les informations à l'écran via la sortie standard.
		# recuperation du resultat de grep dans la variable.
	audio=`/var/subsonic/transcode/ffmpeg -i  "$1" 2>&1| grep '(fre): Audi'`
		# supprime de la variable 'Stream #' ainsi que tous ce qui le precede.
	audio="${audio##*Stream #}"
		# supprime de la variable '(fre)' et tous ce qui suit
	audio=${audio%(fre)*}
		# la variable contien à ce moment là soit le mappage attendu pour le francais (ex: '0.1') soit rien
		# même principe pour le mappage de la vidéo car pour mapper en manuel dans ffmpeg il faut lui donner l'ensemble des flux.
		# recherche le mapping de la video via la commande ffmpeg -i
	video=`/var/subsonic/transcode/ffmpeg -i  "$1" 2>&1| grep ': Video'`
	video="${video##*Stream #}"
	video=${video%%(*}
		# si piste audio FR détecté alors force le map dans la conversion.
		# pas de test sur la variable vidéo car en cas d'erreur c'est ffmpeg qui prendra en charge de mapper automatiquement la première piste vidéo.
	if ["${audio}" -e ""]
	then
		echo "${maintenant};${1};Pas de piste audio française trouvée." >> "$log";
		echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi ${cible}${fichier%.*}.avi" >> "$log";
		/var/subsonic/transcode/ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi "${cible}${fichier%.*}".avi;
	else
		echo "${maintenant};${1};Piste audio française trouvée." >> "$log";
		echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map ${video} -map ${audio} -ac 2 -v 0 -f avi ${cible}${fichier%.*}.avi;" >> "$log";
		/var/subsonic/transcode/ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map "${video}" -map "${audio}" -ac 2 -v 0 -f avi "${cible}${fichier%.*}".avi;
	fi 
}
actionScript() {
actualiseTimeOfTreatment #demande de mise à jour de la variable temps (maintenant)
if [ "$flag" = "non" ] #Si fichier non trouvé
	then 	
		echo "$1" >> "$absent";
		actionMKVtoAVI "$1"
	else	#Si fichier trouvé	
		echo "${maintenant};${1};${flag}" >> "$log" ;
		echo "$1" >> "$existant";
	fi 
	return
}
rechercheCible() { #Dans le cas des boucles for le résultat d'un repertoir n'est pas fini par un '/' c'est pourquoi je l'ajoute apres ${u}"/"
	for u in "$1"* ;do  #Boucle sur tout le contenu du repertoir passé en paramètre
		if [ -d "$u" ] #Si repertoire
		then
			if [ -f "${u}"/"$2" ] #si le fichier existe dans le répertoire 
			then
				flag="${u}"/"$2"  #valorise le flag pour dire que le fichier est présent					
				return  #quitte la fonction
			else
				rechercheCible "${u}/" "$2" #sinon explore le contenu de ce nouveau répértoire
			fi
		fi
	done
	return #Si je sorts ici alors c'est que je n'ai rien trouvé...
}
rechercheSource() {
	for i in "$1"* ;do #Boucle sur l'ensemble des fichiers 
		flag="non" #Passe le drapeau à non avant de faire la recherche dans le repertoire cible
		if [ -d "$i" ] #Si repetoire
		then 
			rechercheSource "${i}/"  #Recherche dans le sous répertoire
		else
			currentExtension="${i##*.}" #Extraction de l'extension
			nom="${i##*/}"	#extraction du nom de fichier		
			if [ "$currentExtension" = "${extension}" ]
			then	
				if [ -f "${repertoirCible}${nom%.*}".avi ] #si le fichier existe dans le répertoire cible
				then
					flag="${repertoirCible}${nom%.*}".avi  #valorise le flag pour dire que le fichier est présent
					actionScript "$i" #Demande l'execution d'une action	
				else
					rechercheCible "$repertoirCible" "${nom%.*}".avi #recherche sa présence dans les sous répértoires Cible (apres avoir changé son extension)
					if [ "$flag" = "non" ] #Si fichier non trouvé
					then
						actualiseRepertoireCible "$1" #Afin de créer le repertoire cible.	
					fi		
					actionScript "$i" #Demande l'execution d'une action
				fi
			else
				echo "${maintenant};${1};n'est pas un fichier $extension">> "$log";
				echo "$i" >> "$erreur";
			fi
		fi
	done
	return
}

rechercheSource "$repertoirSource" 

echo "Job's done by Tom";

dans ce dernier code j'ai précisé l'adresse de mon ffmpeg car j'execute ce code sur un serveur d'application qui utilise son propre ffmpeg il vous faudra la modifier.
changer

/var/subsonic/transcode/ffmpeg 

par

ffmpeg

Cordialement,
Thomas R

#3 Re : -1 »  Redirection de dossiers et Profil itinérant » Le 14/06/2013, à 03:09

nassertom
Réponses : 5

Bonjour,
je relance ce sujet pour savoir si tu as trouvé une solution à la hauteur de tes attentes Domim ?

Car j'aimerais faire la même chose chez moi pour le compte de mes enfants (entre poste fix et portable) le tout si possible sans windows.

Je parle bien d'une itinérante et non uniquement un montage réseau et un domaine.
J'imagine :
- une installation des logiciels manquant sur la machine mais présent dans le profils de l'utilisateur.
- des applications présente dans la machine mais non dispo pour l'utilisateur suite à l'absence de celui-ci dans son profil
- le tout sans que l'utilisateur n'ai a avoir des droits d'admin mais bien pris en charge par le serveur

Donc si tu as des news se serait sympa de partager (car pour le moment je ne vois que des scripts maison pour faire cela exécuter a des run level différent)

Au plaisir

#4 Re : -1 »  Script pour fdupes » Le 14/09/2010, à 03:39

nassertom
Réponses : 22

Bonsoir,

ne manque t il pas le -f dans l'utilisation d'un fichier ?

et donc plutôt comme ca :

$ fdupes -rf help/ save/ > doublons.txt

Sinon je pense que c'est la cata wink.
Cordialement,

#5 -1 »  shopt: not found » Le 29/09/2011, à 18:35

nassertom
Réponses : 11

Bonjour,

J'ai souhaité rendre récursive une boucle "for i" en utilisant "globstat"

#!/bin/bash
shopt -s globstar

for i in "$1"/**/*.mp3;do  

mais le terminal me répond :
2: shopt: not found

je suis en ssh et un man shopt ne fonctionne pas.
Si quelqu'un a une idée ?
D'avance merci

#6 Re : -1 »  shopt: not found » Le 29/09/2011, à 19:39

nassertom
Réponses : 11

Merci pour vos messages,

la réponse du terminal est :

autocd             off
cdable_vars        off
cdspell            off
checkhash          off
checkjobs          off
checkwinsize       on
cmdhist            on
compat31           off
compat32           off
compat40           off
dirspell           off
dotglob            off
execfail           off
expand_aliases     on
extdebug           off
extglob            on
extquote           on
failglob           off
force_fignore      on
globstar           off
gnu_errfmt         off
histappend         on
histreedit         off
histverify         off
hostcomplete       off
huponexit          off
interactive_comments    on
lithist            off
login_shell        on
mailwarn           off
no_empty_cmd_completion    off
nocaseglob         off
nocasematch        off
nullglob           off
progcomp           on
promptvars         on
restricted_shell    off
shift_verbose      off
sourcepath         on
xpg_echo           off

sinon effectivement dans mon shell il y a bien un done et une instruction.

et par exemple un echo sur $i me donne une adresse du type :
/home/**/*.mp3
ce qui montre bien que l'instruction shopt n'est pas prise en compte.

#7 Re : -1 »  shopt: not found » Le 30/09/2011, à 04:34

nassertom
Réponses : 11

Finalement en relançant mon bash il a fonctionné.
Cependant l'utilisation de globstar ne me permet pas d'explorer en profondeur mes répertoires celui ci s'arrête au second niveau ??
ce qui complique mon shell.

Mon besoin est de faire une recherche dans un repertoire source pour chercher un type de fichier. puis de vérifier la présence de chaqu'un de ces fichiers dans une arboréssence Cible. et effectuer un traitement différent en fonction de la présence ou non du fichier dans la cible.

J'ai de ce fait codé vite fait des fonctions récursives pour me permetre de faire ceci, mais comme je suis fainéant et que je me dit qu'il ne sert à rien de réinventer la roue.
savez-vous si il existe quelque chose qui me permete ceci du genre un find avec un exec si vrai et un autre si faux ...

Voici le bout de code que j'ai fait et qui fonctionne sans problème.

D'avance merci (PS : toutes les remarques sur mon code sont bienvenu car j'ai l'envie d'apprendre)

#!/bin/bash
#Paramètres du shell
repertoirSource="/home"
repertoirCible="/mp3"
extension="wma"

flag="non"
actionScript() {
if [ "$flag" = "oui" ] #Si fichier trouvé
    then     
        echo "$1";
        echo existe dans "$2";
    else    #Si fichier non trouvé    
        echo "$1";
        echo "n' existe pas dans" "$2";
    fi 
    return
}
rechercheCible() {
    for u in "$1"/* ;do  #Boucle sur tout le contenu du repertoir passé en paramètre
        if [ -d "$u" ] #Si repertoire
        then
            if [ -f "${u}"/"$2" ] #si le fichier existe dans le répertoire 
            then
                flag="oui"  #valorise le flag pour dire que le fichier est présent                    
                return  #quitte la fonction
            else
                rechercheCible ${u} $2 #sinon explore le contenu de ce nouveau répértoire
            fi
        fi
    done
    return #Si je sorts ici alors c'est que je n'ai rien trouvé...
}
rechercheSource() {
    for i in "$1"/*."$2" ;do #Boucle sur l'ensemble des fichiers dont l'extension est passé en paramètre
        flag="non" #Passe le drapeau à non avant de faire la recherche dans le repertoire cible
        if [ -d "$i" ] #Si repetoire
        then 
            rechercheSource "$i" "$2" #Recherche dans le sous répertoire
        else
            nom="${i##*/}"    #extraction du nom de fichier        
            rechercheCible "$3" "${nom%.*}".mp3 #recherche sa présence dans le répértoire Cible (apres avoir changé son extension
            actionScript "$i" "$3" #Demande l'execution d'une action
        fi
    done
    return
}

rechercheSource "$repertoirSource" "$extension" "$repertoirCible"

echo "Job's done by Tom";

#8 Re : -1 »  shopt: not found » Le 30/09/2011, à 05:03

nassertom
Réponses : 11
aduxas a écrit :
nassertom a écrit :

Cependant l'utilisation de globstar ne me permet pas d'explorer en profondeur mes répertoires celui ci s'arrête au second niveau ??

Si, ça descend un nombre illimité ( smile ) de niveaux "zero or more directories and  subdirectories".  Du moins, chez moi ça marche.

Je ne comprends vraiment pas pourquoi ça fait cela chez moi alors.

#9 Re : -1 »  shopt: not found » Le 01/10/2011, à 17:59

nassertom
Réponses : 11

Bonjour,

Désolé de ne pas avoir posté avant.
aduxas je ne comprends pas ton message, c'est une question pour moi ?
Postmortem merci pour ta contribution. à ce jour j'ai quelques difficulter pour comprendre le fonctionnement du shell que tu m'as écrit surtout identifier le sécquencement des traitements.

Dans ce que je comprents tu fais :
1/ un find qui envoi le contenu de ce qu'il trouve dans la boucle while tu utilise print0 pour ne pas être géné par les espaces.
c'est dans le même principe que xarg un peu ?
2/ ${REPLY##*/} tu suprimes le chemin pour ne garder que le nom.
$REPLY est le '$i' du 'For i' in dans une boucle while ?
3/ tu changes l'extension pour faire ta future recherche via find
4/ tu fais un find

Question comment fait tu pour effectuer un traitement différent si il y a un résultat de pas de résultat dans le dernier find ?

Désolé pour mes questions.

Voici mon script finalisé qui je le pense peut être rationalisé.

#!/bin/bash

if [ $# != 2 ] # Test le nombres de paramètre passé au shell
then
    echo erreur dans la saisie des paramètres;
    echo "essayer : sh $0 /repertoire_source /repertoire_cible";
    exit 0 # Quitte le shell
elif [ ! -d "$1" -o ! -d "$2" ] # Test que les paramètres soient bien des repertoires
then
    echo il faut renseigner des répertoirs dans les paramètres;
    exit 0
fi
#Paramètres du shell
repertoirSource="${1%/}/" # Supprime le slash de la fin si il existe puis en ajoute un (pour éviter d'en avoir 2 si l'utilisateur l'avait mis)
repertoirCible="${2%/}/"
extension="mkv"
#Fichiers de log pour exploitation future
log="$repertoirCible"log.txt
existant="$repertoirCible"existant.txt
absent="$repertoirCible"absent.txt
erreur="$repertoirCible"erreur.txt

flag="non" #Drapeau pour communiquer entre les fonctions
maintenant=$(date) #Pour afficher l'heure et la date dans le fichier de log

#Fonction pour mettre à jour la date et heure dans la variable.
actualiseTimeOfTreatment() {
    maintenant=$(date '+%Y-%m-%d %H:%M:%S')
}
#Fonction métier besoin de ripper des fichiers mkv en avi avec une selection automatique de la langue francaise si présente
actionMKVtoAVI() {
    fichier="${1##*/}" #Récupération du nom de fichier passé en paramètre (idem que d'utiliser basename)
    echo "${maintenant};${1};demande de conversion." >> "$log";
        # recherche le mapping des pistes audio FR via la commande ffmpeg -i
        # redirection de la sortie 2 vers la 1 car ffmpeg n'affiche pas les informations à l'écran via la sortie standard.
        # recuperation du resultat de grep dans la variable.
    audio=`ffmpeg -i  "$1" 2>&1| grep '(fre): Audi'`
        # supprime de la variable 'Stream #' ainsi que tous ce qui le precede.
    audio="${audio##*Stream #}"
        # supprime de la variable '(fre)' et tous ce qui suit
    audio=${audio%(fre)*}
        # la variable contien à ce moment là soit le mappage attendu pour le francais (ex: '0.1') soit rien
        # même principe pour le mappage de la vidéo car pour mapper en manuel dans ffmpeg il faut lui donner l'ensemble des flux.
        # recherche le mapping de la video via la commande ffmpeg -i
    video=`ffmpeg -i  "$1" 2>&1| grep ': Video'`
    video="${video##*Stream #}"
    video=${video%%(*}
        # si piste audio FR détecté alors force le map dans la conversion.
        # pas de test sur la variable vidéo car en cas d'erreur c'est ffmpeg qui prendra en charge de mapper automatiquement la première piste vidéo.
    if ["${audio}" -e ""]
    then
        echo "${maintenant};${1};Pas de piste audio française trouvée." >> "$log";
        echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi ${repertoirCible}${fichier%.*}.avi" >> "$log";
        ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -ac 2 -v 0 -f avi "${repertoirCible}${fichier%.*}".avi;
    else
        echo "${maintenant};${1};Piste audio française trouvée." >> "$log";
        echo "${maintenant};${1};ffmpeg -i $1 -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map ${video} -map ${audio} -ac 2 -v 0 -f avi ${repertoirCible}${fichier%.*}.avi;" >> "$log";
        ffmpeg -i "$1" -async 1 -s 720x576 -r 24 -ab 128k -b 1200k -aspect 16:9 -map "${video}" -map "${audio}" -ac 2 -v 0 -f avi "${repertoirCible}${fichier%.*}".avi;
    fi 
}
actionScript() {
actualiseTimeOfTreatment #demande de mise à jour de la variable temps (maintenant)
if [ "$flag" = "non" ] #Si fichier non trouvé
    then     
        echo "$1" >> "$absent";
        actionMKVtoAVI "$1"
    else    #Si fichier trouvé    
        echo "${maintenant};${1};${flag}" >> "$log" ;
        echo "$1" >> "$existant";
    fi 
    return
}
rechercheCible() { #Dans le cas des boucles for le résultat d'un repertoir n'est pas fini par un '/' c'est pourquoi je l'ajoute apres ${u}"/"
    for u in "$1"* ;do  #Boucle sur tout le contenu du repertoir passé en paramètre
        if [ -d "$u" ] #Si repertoire
        then
            if [ -f "${u}"/"$2" ] #si le fichier existe dans le répertoire 
            then
                flag="${u}"/"$2"  #valorise le flag pour dire que le fichier est présent                    
                return  #quitte la fonction
            else
                rechercheCible "${u}/" "$2" #sinon explore le contenu de ce nouveau répértoire
            fi
        fi
    done
    return #Si je sorts ici alors c'est que je n'ai rien trouvé...
}
rechercheSource() {
    for i in "$1"* ;do #Boucle sur l'ensemble des fichiers 
        flag="non" #Passe le drapeau à non avant de faire la recherche dans le repertoire cible
        if [ -d "$i" ] #Si repetoire
        then 
            rechercheSource "${i}/"  #Recherche dans le sous répertoire
        else
            currentExtension="${i##*.}" #Extraction de l'extension
            nom="${i##*/}"    #extraction du nom de fichier        
            if [ "$currentExtension" = "${extension}" ]
            then    
                if [ -f "${repertoirCible}${nom%.*}".avi ] #si le fichier existe dans le répertoire cible
                then
                    flag="${repertoirCible}${nom%.*}".avi  #valorise le flag pour dire que le fichier est présent
                    actionScript "$i" #Demande l'execution d'une action    
                else
                    rechercheCible "$repertoirCible" "${nom%.*}".avi #recherche sa présence dans les sous répértoires Cible (apres avoir changé son extension)        
                    actionScript "$i" #Demande l'execution d'une action
                fi
            else
                echo "${maintenant};${1};n'est pas un fichier $extension">> "$log";
                echo "$i" >> "$erreur";
            fi
        fi
    done
    return
}

rechercheSource "$repertoirSource" 

echo "Job's done by Tom";

D'avance merci,

#10 Re : -1 »  shopt: not found » Le 03/10/2011, à 02:14

nassertom
Réponses : 11

Bonsoir,

Merci d'avoir pris le temps de répondre à chacune de mes questions.
J'espère que bientôt moi aussi je pourrai être de bon conseil.

#11 Re : -1 »  Installation LEXMARK X4550 » Le 13/08/2010, à 02:23

nassertom
Réponses : 48

Bonjour,

Je suis aussi un "heureux" possesseur de cette machine mad

Je travail sur plusieurs system dont Mac et j'ai installé les drivers sous mac qui fonctionne (rien d'extraordinaire)

mais je me pensais que si osx tourne sous unix il doit être plus simple de convertir les drivers que depuis windows (ce que fait ndiswrapper).

pensez vous qu'il soit possible de recompiler des drivers mac vers linux ?

Cordialement,

#12 -1 »  boucle sur l'ensemble des fichiers .mp3 problème avec les espaces » Le 14/08/2011, à 08:44

nassertom
Réponses : 11

Bonjour,

j'utilise un script qui me permet de convertir des fichiers.

mon problème est que seul les fichiers qui n'ont pas d'espace dans le nom sont vue.

voici un extrait :

#!/bin/bash
if [$1 -e ""]
then
  media_dir="."
else
  media_dir=$1
fi

echo Repertoire selectionné : $media_dir
for i in $media_dir/*.mp3;do  
# on vérifie que $i contient au moins un slash, pour récupérer le chemin du fichier
[[ $i == */* ]] && chemin=${i%/*}/ || chemin=
# on récupère le nom du fichier
nom=${i##*/}
# ici les commandes que je souhaite faire via les variables ${chemin}${nom%.*}
done

si dans mon répertoir j'ai :
ma chanson.mp3
mes-chansons.mp3

seul mes-chansons.mp3 sera vu.

J'ai pensé à utiliser find et iname pour ne plus tenir compte de la casse mais je ne sais pas comment exploiter ma variable $media_dir entre 'quote'

for i in `find . -iname '*.mp3'`;

Question bête :
- je ne sais pas voir ou se termine la boucle 'for' dans le code (une fin comme {} en java ou le next en vb) car par exemple j'aimerais bien faire un 'rm *.mp3' une foi l'ensemble des boucles faite.

D'avance merci,

#13 Re : -1 »  boucle sur l'ensemble des fichiers .mp3 problème avec les espaces » Le 15/08/2011, à 03:30

nassertom
Réponses : 11

Bonjour et merci pour vos réponses.

Alors si j'ai bien compris, il ne faut pas que je fasse un find dans mon for. ça ok.
pour ce qui est de mon problème d'espace des simples double-quote. je n'ai pas encore testé mais moi j’étais parti sur l'utilisation de l'IFS

#pour des espaces dans les noms
oldIFS=$IFS
IFS=$'\\t\\n'
....
IFS=$oldIFS

il y a une chose que je n'arrive pas à comprendre car ce qui ne fonctionne pas, ce n'est pas les données en entrées car sinon ma boucle ne retournerait rien.
par sécurité je vais suivre vos conseils qui j'en suis sur m’aideront à prendre de bonnes habitudes. telle que le for i in "$media_dir"/*.mp3;do

je pense que c'est le fruit de la boucle qui pose problème et donc la variable $i donc en toute logique c'est celle-ci que je devrais mettre entre double quote. c'est ça ?

# on vérifie que $i contient au moins un slash, pour récupérer le chemin du fichier
[[ "$i" == */* ]] && chemin="${i%/*}"/ || chemin=
# on récupère le nom du fichier
nom="${i##*/}"

D'avance merci pour votre aide.
et sinon pour ma question bête... sur les boucles à en lire vos exemples c'est le 'done' qui indique la fin de la boucle ? moi je pensais que le done etait la pour la fin du script. lol

#14 Re : -1 »  boucle sur l'ensemble des fichiers .mp3 problème avec les espaces » Le 15/08/2011, à 09:46

nassertom
Réponses : 11

bonjour,
Merci FRUiT pour tes explications precises.

Désolé de ne pas avoir pris le temps de lire le lien de ton premier poste avant de poser ma question.

je place ton lien dans mes postits car il est riche d ensegnement pour quelqu un qui debut en bash.

Poste résolu wink

#15 Re : -1 »  Rotation écran sur tablet PC TC4200 » Le 26/05/2010, à 20:01

nassertom
Réponses : 11

Bonjour,

A la lumière des réponses qui m'ont été faites tongue, je penses avoir un réel problème.

Même si vous n'avez pas de solution, savez vous comment puis je faire pour travailer sur le sujet ?
Dans mes souvenirs, je devais déclarer le stylo dans le fichier xorg.conf.
Cependant à ce jour les commandes dans le terminal ne sont pas reconnus.

J'ai vu qu'il été possible de configurer les boutons du stylo dans les fichiers de config wacom. pensez-vous que ce fichier de config puisse mettre utile pour déclarer le stylo dans xorg ? ou simplement trouver le nom de mon périférique pour que en cas d'utilisation dans le terminal je n'ai pas un message m'indiquant qu'il ne connait pas le materiel.

Toutes les aides sont la bienvenue.
D'avance merci

#16 Re : -1 »  Rotation écran sur tablet PC TC4200 » Le 20/06/2010, à 13:35

nassertom
Réponses : 11

Bonjour,

Ca fait plaisir de voir que je ne suis pas le seul dans ce cas !!

N'hesite pas à poster ici le fruit de tes recherches.

#17 Re : -1 »  Rotation écran sur tablet PC TC4200 » Le 13/12/2010, à 01:34

nassertom
Réponses : 11

Bonjour,

c'est en faisant quelques recherche aujourd'hui (j'avais laissé le sujet de côté) que j'ai trouvé la solution alors qu'elle était sous mes yeux mad

en fait j'essayais de faire la rotation du pointeur de cette façon

xsetwacom set stylus rotate 1
Cannot find device 'stylus'.

visiblement depuis la 10.04 (enfin je pense) stylus n'est plus reconnu et il faut utilisé l'ID du pointeur.
voila ce que me donne la commande "xinput --list :

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                  id=10    [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                          id=11    [slave  pointer  (2)]
⎜   ↳ Serial Wacom Tablet eraser                  id=12    [slave  pointer  (2)]
⎜   ↳ Serial Wacom Tablet                         id=13    [slave  pointer  (2)]
⎜   ↳ Macintosh mouse button emulation            id=14    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=9    [slave  keyboard (3)]

en fait l'id de mon stylus est id=13

donc après l'essai avec 13

xsetwacom set 13 rotate 1
Usage: xsetwacom <device name> Rotate [NONE | CW | CCW | HALF]

on avance...
Il ne reste plus qu'a utiliser le text en lieu et place des nombres :
NONE=0
CW=1
...

maintenant pour faire la rotation de l'écran en même temps que le stylus rien de mieux qu'un petit script

#!/bin/sh

if [ $1 == 'normal' ]
then
    xrandr -o normal
    xsetwacom set 13 rotate NONE
elif [ $1 == 'left' ]
then
    xrandr -o left
    xsetwacom set 13 rotate CCW
elif [ $1 == 'right' ]
then
    xrandr -o right
    xsetwacom set 13 rotate CW
elif [ $1 == 'inverted' ]
then
    xrandr -o inverted
    xsetwacom set 13 rotate HALF
fi

surtout pensez à le rendre exécutable et à modifier l'ID

#18 Re : -1 »  Rotation écran sur tablet PC TC4200 » Le 13/12/2010, à 01:40

nassertom
Réponses : 11

Re à tous,
Si quelqu'un sait comment je peux automatiser ce script avec la rotation de l'écran ?
car sous Windows l'affichage change sans avoir à cliquer sur quoi que se soit.
il doit y avoir un capteur au niveau du croché qui maintien l'écran contre le clavier.

D'avance merci pour votre aide.

#19 Re : -1 »  Rotation écran sur tablet PC TC4200 » Le 26/03/2011, à 02:18

nassertom
Réponses : 11

Bonjour Miasma87,

Merci pour ta contribution big_smile

Quand tu dis "tu peux mettre dans les raccourcis clavier ton script associé au hotkeys en dessous de le l'écran" tu parles du clavier ou des touches de l'écran qui sont accessible normalement via le stylo ??

De plus peux-tu me préciser la marche à suivre ?

D'avance merci,

#20 Re : -1 »  Nouveautés dans Lucid... » Le 16/05/2010, à 15:54

nassertom
Réponses : 5313

Bonjour,

J'ai testé cette manipulation graphique et chez moi cela fonctionne.
J'ai un tc4200 les repères de la sourie on bien effectué cette rotation (touchpad).
Cependant le stylo lui n'a pas fait cette rotation et donc inutilisable.

Savez vous quel type de fichier modifier ou script executé ?
J'ai ouvert un poste sur ce sujet ici :
http://forum.ubuntu-fr.org/viewtopic.php?id=397039

D'avance merci pour votre aide.

#21 Re : -1 »  [java]odbc (jdbc) et mbd (fichier access) » Le 31/07/2010, à 02:04

nassertom
Réponses : 3

Bonjour,

As tu trouvé une solution pour ton problème ?

j'ai la même chose pour un programme que j'ai développé en Java qui fonctionne sous Windows mais pas sous linux !!!

Je sais que vouloir utiliser une base accèss sous linux est stupide mais je n'ai pas le choix car ceux qui exploite les données sont sous Windows ...

D'avance merci,
Cordialement

#22 -1 »  Subsonic, passer de Jetty à tomcat » Le 20/08/2010, à 05:16

nassertom
Réponses : 1

Bonjour,

J'ai installé un serveur avec une solution ubuntu deja configuré "mythbuntu" et donc avec xfce et apache2.
J'ai installé subsonic avec le deb prévu pour ubuntu. celui ci n'a pas installé tomcat et de ce fait je pense qu'il tourne a l'aide de jetty.

Mon problème est que mon server java tombe tout les jours (subsonic n'est plus accessible alors qu'apache est toujours dispo). je n'arrive pas à relancer celui ci, je suis donc obligé de redémarrer complètement la machine et donc obligé d'etre à coté pour le rebouter et rentrer les codes... (acces wifi).

De ce fait je souhaite installer tomcat qui je l'espère sera plus stable et dont je serais capable de le redémarrer manuellement.

Cependant, j'ai peur qu'installer un server tomcat alors que jetty soit deja integré à la solution ne crée des conflis.

Comment puis-je supprimer jetty ? (je ne sais pas ou il se trouve)

D'avance merci pour votre aide.
Cordialement,

ps : voici ce que me retourne la commande suivante

sudo find / -name jetty
/var/subsonic/jetty

cd /var/subsonic/jetty
ls -a
. .. 1524

cd 1524
ls -a
. .. jsp webapp

#23 Re : -1 »  Subsonic, passer de Jetty à tomcat » Le 20/08/2010, à 07:40

nassertom
Réponses : 1

Bonjour,

j'ai avancé, et trouvé que subsonic se démarre comme tout les autres services linux avec "/etc/init.d/subsonic restart"

Bon, j'ai installé tomcat6 et déployé subsonic.war (pas sans problème....  il n'y a qu'a voir l'heure de mon précèdent message)

Bref, maintenant cela fonction pour tomcat et subsonic et je me demande si il sufis de supprimer le fichier subsonic présent dans init.d pour être débarrassé de jetty et simplement savoir si cela est propre de façon de faire ?

D'avance merci pour vos réponses cela dit en attendant, je vais simplement déplacer ce fichier dans un autre endroit au-cas ou ...

#24 Re : -1 »  ecran convertible » Le 16/05/2010, à 15:38

nassertom
Réponses : 2

Bonjour,

Avez-vous trouvés une solution ?

J'ai un TC4200 de chez HP et je suis dans la même situation.

Ubuntu 10.04 (cela a marché sur kubuntu 8.04)

Cordialement,