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 12/08/2010, à 14:57

nono313

[Résolu]Lancer un script à partir d'un autre script shell

Bonjour,
Je viens d'écrire deux script.
Le premier se charge d'extraire des fichiers zip dans des dossiers déjà existants :

#!/bin/bash
exec 3< <(ls -d */ | sort -nk2 -te)
ls *$1*.zip | sort -nk3 -t- | while read zip
do
    read dossier <&3
    echo -e "unzip \"$zip\"\t -d \t\"${dossier}\""
    echo -e "./extraire2.sh \"$dossier\""	
done
while [ -z $ok ] || [ $ok != 'o' ]
do
  read -p "Voulez-vous effectuez l'extraction ? (o/n) " ok
  if [ $ok == 'n' ]
    then 
    exit 0
  fi
done
exec 3< <(ls -d */ | sort -nk2 -te)
ls *$1*.zip | sort -nk3 -t- | while read zip
do
    read dossier <&3
    unzip "$zip" -d "${dossier}"
    #./extraire2.sh "$dossier"			#executer l'autre script
done

L'autre prend comme argument un des dossiers et se charge d'extraire les zip qui sont contenus dedans :

#!/bin/bash
ls "$1"*.zip | sort -nk3 -t- | while read zip
do
    echo -e "unzip \"$zip\" -d \"$1\""
done
while [ -z $okk ] || [ $okk != 'o' ]
do
  read -p "Voulez-vous effectuez l'extraction n°2 ? (o/n) " okk
  if [ $okk == 'n' ]
    then 
    exit 0
  fi
done
ls "$1"*.zip | sort -nk3 -t- | while read zip
do
    unzip "$zip" -d "$1"
done

J'aimerais que le premier script lance le second pour chaque dossier existant.
Pour cela j'ai fais :

./extraire2.sh "$dossier"

Lorsque je lance le premier script avec cette ligne, j'obtiens un message d'erreur qui se répete :

./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu
./extraire2.sh: ligne 9 : [: == : opérateur unaire attendu

Je ne comprends pas pourquoi j'ai ce message, étant donné que lorsque je lance les script manuellement et séparément, ils fonctionnent.

Merci d'avance pour vos réponses.

EDIT : le problème est résolu, on essaye d'améliorer les scripts pour les publier plus tard sur le forum.

Dernière modification par nono313 (Le 13/08/2010, à 14:47)

Hors ligne

#2 Le 12/08/2010, à 15:04

Totor

Re : [Résolu]Lancer un script à partir d'un autre script shell

remplace [ $ok == 'n' ] par [ "${ok}" == 'n' ] et [ $okk == 'n' ] par [ "${okk}" == 'n' ] et ça devrait aller mieux


-- Lucid Lynx --

Hors ligne

#3 Le 12/08/2010, à 15:30

Compte anonymisé

Re : [Résolu]Lancer un script à partir d'un autre script shell

Ca me rappelle quelque chose en effet, avec les 'if'.

#4 Le 12/08/2010, à 15:43

nono313

Re : [Résolu]Lancer un script à partir d'un autre script shell

J'ai modifié les if et effectivement je n'ai plus le message d'erreur.
Cependant j'ai l'impression que le script 2 bloque au moment de la boucle while.
La question compris dans la commende read ne s'affiche pas et le programme tourne en boucle infini (ce qui explique pourquoi j'avais le message d'erreur de nombreuses fois).
Je ne comprends pas pourquoi le read du premier script fonctionne et pas celui du deuxième.

Hors ligne

#5 Le 13/08/2010, à 13:04

nono313

Re : [Résolu]Lancer un script à partir d'un autre script shell

J'ai supprimé la boucle while dans le deuxième fichier et maintenant cela fonctionne.
J'aimerais quand même savoir comment modifier ma boucle while pour que cela fonctionne car elle me permet de visualiser les changements avant qu'ils ne soient effectués

Hors ligne

#6 Le 13/08/2010, à 13:19

sksbir

Re : [Résolu]Lancer un script à partir d'un autre script shell

nono313 a écrit :

J'ai supprimé la boucle while dans le deuxième fichier et maintenant cela fonctionne.....

Bonjour,
c'est pas très clair, tu peux rééditer ton 1er message et mettre en gras ce que tu as supprimé ?

D'après moi et ce que j'ai compris de tes scripts, il y a un soucis ici:

....
ls *$1*.zip | sort -nk3 -t- | while read zip
do
    read dossier <&3...

&3, c'est l'entrée standard si je me souviens bien..
Avec ta commande read dossier, tu rediriges l'entree standard

Le problème, c'est que tu as déja redirigé l'entrée standard dans ta boucle juste au dessus avec le dernier | avant while read zip...

Essaye de remplacer
ls *$1*.zip | sort -nk3 -t- | while read zip
par
for zip in `ls *$1*.zip | sort -nk3 -t-`

et dis moi si ça va mieux comme ça...

Hors ligne

#7 Le 13/08/2010, à 14:23

nono313

Re : [Résolu]Lancer un script à partir d'un autre script shell

Merci à vous tous, le problème est résolu big_smile
J'ai fais les modifications que sksbir proposait et cela fonctionne roll
Je vais publier mon script dans la rubrique Trucs, astuces en espérant qu'il puisse être utile à d'autre cool

Hors ligne

#8 Le 13/08/2010, à 14:27

Totor

Re : [Résolu]Lancer un script à partir d'un autre script shell

avant de le poster dans "trucs et astuces", poste-le ici et précise exactement son objectif car à première vue, il y a quelques éléments inutiles, d'autres à revoir.


-- Lucid Lynx --

Hors ligne

#9 Le 13/08/2010, à 14:45

nono313

Re : [Résolu]Lancer un script à partir d'un autre script shell

Pas de problème smile
Donc enfaite pour tout dire, je dispose de plusieurs dossier avec dans chacun d'eux plusieurs fichiers .avi, ainsi que de fichiers ZIP un peu spéciaux :
chaque zip (correspondant à un dossier) contient plusieurs zip (correspondant aux fichiers avi) avec plusieurs versions de fichiers .srt (sous-titres).
Je sais que ce n'est pas facile à comprendre voici donc un petit "schéma de la structure de tout cela :

./dossier1/fichier1.avi
./dossier1/fichier2.avi
./dossier2/fichier3.avi
./dossier2/fichier4.avi
./zip_dossier1.zip/zip_fichier1.zip/fichier1_tvu.srt
./zip_dossier1.zip/zip_fichier1.zip/fichier1_dvd.srt
./zip_dossier1.zip/zip_fichier2.zip/fichier2_tvu.srt
./zip_dossier1.zip/zip_fichier2.zip/fichier2_tvu.srt
./zip_dossier2.zip/zip_fichier3.zip/fichier3_tvu.srt
./zip_dossier2.zip/zip_fichier3.zip/fichier3_dvd.srt
./zip_dossier2.zip/zip_fichier4.zip/fichier4_tvu.srt
./zip_dossier2.zip/zip_fichier4.zip/fichier4_tvu.srt

Le but des scripts est donc d'extraire les zip, de placer correctement les bonnes versions des srt (dans mon cas *_tvu.srt) et de renommer les fichiers srt en fonction des avi pour pouvoir les lire automatiquement avec un lecteur comme VLC .
Premier script d'extraction des zip en zip:

#!/bin/bash
echo "###############   EXTRACTION DES PREMIERS ZIP   ###############"
exec 3< <(ls -d */ | sort -nk2 -te)
for zip in `ls *$1*.zip | sort -nk3 -t-`
do
  read dossier <&3
  echo -e "unzip \"$zip\"\t -d \t\"${dossier}\""
  echo -e "./extraire2.sh \"$dossier\""	
  echo -e "./sous-titres.sh \"${dossier}\" _tvu"
done
echo -e "rm */*_dvd.srt"
echo -e "rm */*.zip"
while [ -z $ok ] || [ $ok != 'o' ]
do
  read -p "Voulez-vous effectuez l'extraction ? (o/n) " ok
  if [ "${ok}" == 'n' ]
    then 
    exit 0
  fi
done
exec 3< <(ls -d */ | sort -nk2 -te)
for zip in `ls *$1*.zip | sort -nk3 -t-`
do
  read dossier <&3
  unzip "$zip" -d "${dossier}"
  ./extraire2.sh "${dossier}"			#executer l'autre script
  ./sous-titres.sh "${dossier}" _tvu
  rm */*_dvd.srt
  rm */*_dvd*.srt
  rm */*.zip
done

Deuxième script d'extraction des zip en srt :

#!/bin/bash
echo "###############   EXTRACTION DES ZIP INCLUS   ###############"
ls "$1"*.zip | sort -nk3 -t- | while read zipp
do
    echo $1
    echo -e "unzip \"$zipp\" -d \"$1\""
echo $dossierr
done
while [ -z $okk ] || [ "${okk}" != 'o' ]
do
  echo "Voulez-vous effectuez l'extraction n°2 ? (o/n) " 
  read okk
  if [ "${okk}" == 'n' ]
    then
    exit 0
  fi
done
ls "$1"*.zip | sort -nk3 -t- | while read zipp
do
    unzip "$zipp" -d "$1"

done
exit 0

Troisième script qui renomme les fichiers srt par rapports au avi (et pour les mpg) :

#! /bin/bash
echo "###############   RENOMMER LES SOUS-TITRES   ###############"
###### $1 = dossier	$2 = type (720p,tvu...)#########
exec 3< <(ls "$1"*avi | sort -nk2 -te)
ls "$1"*$2.srt | sort -nk3 -t- | while read srt
do
    read avi <&3
    echo -e "\"$srt\"\t\t=>\t\"${avi%avi}srt\""
done
while [ -z $ok ] || [ $ok != 'o' ]
do
  read -p "Voulez-vous effectuez le renommage ? (o/n) " ok
  if [ "${ok}" == 'n' ]
    then 
    exit 0
  fi
done
exec 3< <(ls "$1"*avi | sort -nk2 -te)
ls "$1"*$2.srt | sort -nk3 -t- | while read srt
do
    read avi <&3
    mv "$srt" "${avi%avi}srt"
done


#MPEG#
exec 3< <(ls "$1"*mpg | sort -nk2 -te)
ls "$1"*$2.srt | sort -nk3 -t- | while read srt
do
    read avi <&3
    echo -e "\"$srt\"\t\t=>\t\"${mpg%mpg}srt\""
done
while [ -z $ok ] || [ $ok != 'o' ]
do
  read -p "Voulez-vous effectuez le renommage ? (o/n) " ok
  if [ "${ok}" == 'n' ]
    then 
    exit 0
  fi
done
exec 3< <(ls "$1"*mpg | sort -nk2 -te)
ls "$1"*$2.srt | sort -nk3 -t- | while read srt
do
    read mpg <&3
    mv "$srt" "${mpg%mpg}srt"
done

J'imagine qu'il y a beaucoup de chose à modifier et pour tout dire, je ne m'y connais pas assez en script pour savoir ce qui pourrait être améliorer hmm

Hors ligne