#1 Le 12/08/2010, à 13: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, à 13:47)
Hors ligne
#2 Le 12/08/2010, à 14: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, à 14: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, à 14: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, à 12: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, à 12:19
- sksbir
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.....
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, à 13:23
- nono313
Re : [Résolu]Lancer un script à partir d'un autre script shell
Merci à vous tous, le problème est résolu
J'ai fais les modifications que sksbir proposait et cela fonctionne
Je vais publier mon script dans la rubrique Trucs, astuces en espérant qu'il puisse être utile à d'autre
Hors ligne
#8 Le 13/08/2010, à 13: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, à 13:45
- nono313
Re : [Résolu]Lancer un script à partir d'un autre script shell
Pas de problème
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
Hors ligne