Shell | lister le contenu d'un repertoire !! [Résolu/Fermé]

Signaler
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010
-
 xavyeii -
Salut !

Je voudrai executer un script uniquement si un fichier (quelquonc et quelque soi l'extension) existe dans un repertoire !!!

En gros

Si un fichier existe dans /home/ftp/upload/
alors > continuer le script
sinon arreter le script !!
Fin

Tout ca dans un seul script shell et non en 2 !!

Merci d'avance

9 réponses

Messages postés
1542
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
8 avril 2016
154
Salut
utilise une structure if et un exit dans le cas ou tu souhaite arreter le script
la syntaxe de exit se trouve dans un man exit
Si je ne me trompe pas sa doit être exit(n)
avec n compris entre 1 et se ke tu veu
Pour l'existence d'un fichier, la commande find tubée avec grep doit pouvoir t'aider
Messages postés
5476
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 février 2021
926
Salut,

Avec bash, cela devrait faire l'affaire :

#!/bin/bash

if [ [ -e toto1 ]]
then
  echo "Le fichier toto1 existe"
else
  echo "Le fichier toto1 n'existe pas"
  exit
fi

echo "Je continue"


Quelques liens :
https://tldp.org/LDP/abs/html/fto.html
https://tldp.org/LDP/abs/html/testconstructs.html
https://tldp.org/LDP/abs/html/


Dal
NB : il n'y a pas d'espace entre les [[, si tu fais un copier coller, retire le (je l'ai mis pour tromper le moteur de publication de CCM qui les considère comme des caractères spéciaux)
Messages postés
70
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
1 mars 2012
9 >
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010

Salut,

Un petit bout de code :

if [ -z `ls <repertoire>` ];then
  echo "Le repertoire est vide"
else
  echo "Le repertoire n'est pas vide"
fi


J'espere que cela correspond à ta demande.

Gorki
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010
8 >
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010

je test ca !!!
Merci
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010
8 >
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010

Oki ca marche merci beaucoup !
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010
8
Bon alors ce matin j'en suis la ! et ca ne marche pas .....

Le contenu du else marche , il n'y a pas de proble hje l'ai testé mais le problème est qu'i lme cré des fichier vide : du coup je voudrai qu'il execute mon script uniquement si le dossier /home/ftp/upload/ n'est pas vide !!!!!!
Voici le script (il tourne en boucle grâce a vixie-cron) :

#!/bin/sh
a=0

test -e "/home/ftp/upload/*" && a=1 || a=0

if a=0
  then
      exit
  else
      #Identification de la variable 'date'
      date=`date +%d%m%y_%H:%M:%S`

      #Copie du fichier reçu par ftp dans le dossier /var/tmp/
      mv /home/ftp/upload/test1 /var/tmp/sms.tmp

      #Création du fichier text vide 'sms.txt' dans /var/auto/
      touch /var/auto/sms

      #Copie du numéro de telephone dans le nouveau fichier text 'sms.txt'.
      echo "To: 336xxxxxxxx
      " > /var/auto/sms

      #Copie du contenu du fichier sms.tmp à la suite du fichier 'sms.txt' 
      cat /var/tmp/sms.tmp >> /var/auto/sms

      #Suppression du fichier temporaire
      rm /var/tmp/sms.tmp

      cp /var/auto/sms /var/auto/sms_$date

      #Copie du fichier 'sms.txt' dans /var/spool/sms/ready/ (save) et dans 
      #/var/spool/sms/outgoing/ (envoi définitif)
      cp /var/auto/sms /var/spool/sms/ready/sms_$date
      #cp /var/auto/sms /var/spool/sms/outgoing/sms_$date

      #Suppression du fichier 'sms.txt'
      rm /var/auto/sms_$date
fi


aider moi svp
Messages postés
1867
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
24 juillet 2014
333 >
Messages postés
143
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
16 juillet 2010

Je ne comprend pas bien.
Si tu crée des fichiers vides, le repertoire n'est pas vide, ce qui est normal. Ce script est bien lancé en cas de dossier non vide comme tu le désire.
Bonjour,

J'ai un problème, quasi similaire

Je voudrais que l'utilisateur entre un nom de fichier et que le script vérifie si ce fichier existe a l'intérieur d'une archive et si il existe qu'il soit extrait de l'archive

******************************************************************

Exemple:

Contenue d'une archive "toto.tar.gz":
/repertoire/sousrepertoire/toto

L'utilisateur entre "toto" comme nom de fichier

Ce fichier existe bien dans l'archive alors on l'extrait sinon on dit qu'il n'existe pas.

******************************************************************

Merci par avance,

Xavier
Messages postés
1542
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
8 avril 2016
154
Man tar => cette commande te donnera le manuel de tar. Dedans ya une option (-t si je ne m'abuse, mais je suis vraiment pas sur) qui te permet de lister les fichiers de l'archive.
Par la suite tu peut faire ta lecture au clavier (read me semble-t-il...pareil sa fait lontemps), dans une variable (mettons $ficLu)
Et après tu fait un tar -.....|grep $ficLu et tu test ce résultat: si $?=0 alors il existe et tu l'extrait sinon il existe pas
Ce n'est qu'une idée d'algo, pour les détails techniques, soit un man de tar, grep, read et autres.... soit quelqu'un qui tate du script shell en ce moment.
Déjà merci à toi freto de m'avoir répondu rapidement =)
Je n'ai pas très bien compris ce que tu fais avec le grep

Voilà ce que j'ai déjà fait:



*******************************************************************************************

#liste le contenu de l'archive archive1.tar.gz
tar -tvzf /tmp/lister/archive1.tar.gz

#liste le contenu de l'archive archive2.tar.gz
tar -tvzf /tmp/lister/archive2.tar.gz

#l'utilisateur entre le nom du fichier qu'il veut extraire
echo -ne "\nTaper le nom du fichier pour le restaurer : "
read reponse

*******************************************************************************************


Jusque là tout va bien ! Mais après plus rien ne va..

Il me manque l'algorithme pour dire si l'archive1 contient $reponse, alors on extrait $reponse sinon on dit qu'il n'existe pas (pareil pour archive2)

Même l'extraction sans l'algorithme ne marche pas...


*******************************************************************************************

#Extraction de "repertoire/sousrepertoire/${reponse}" de l'archive "/tmp/lister/archive1.tar.gz" vers la racine
tar -C / -xzf /tmp/lister/archive1.tar.gz repertoire/sousrepertoire/${reponse}

#Extraction de "repertoire/sousrepertoire/${reponse}" de l'archive "/tmp/lister/archive1.tar.gz" vers la racine
tar -C / -xzf /tmp/lister/archive2.tar.gz repertoire/sousrepertoire/${reponse}

*******************************************************************************************




Il me met les erreurs suivantes:

gzip: stdin: decompression OK, trailing garbage ignored
tar: Child returned satus 2
tar: /tmp/lister/archive1.tar.gz: ne peut être retrouvé dans l'archive
(Normal vu que c'est l'archive !)
tar: Statut d'erreur reporté d'erreurs précédentes

gzip: stdin: decompression OK, trailing garbage ignored
tar: Child returned satus 2
tar: /tmp/lister/archive2.tar.gz: ne peut être retrouvé dans l'archive
(Normal vu que c'est l'archive !)
tar: repertoire/sousrepertoire/nomdufichier: ne peut être retrouvé dans l'archive (Normal aussi vu le nom que j'ai rentré ne se trouve que dans archive1.tar.gz !)
tar: Statut d'erreur reporté d'erreurs précédentes







Voilà tout !

Si vous pouvez m'aider ce serait gentil c'est important !

Merci par avance,

Xavier
Messages postés
1542
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
8 avril 2016
154
Ha ya deux archives?? he beh
Bon la du coup sa donnerais sa
tar -tvzf /tmp/lister/archive1.tar.gz >resultat1.txt
tar -tvzf /tmp/lister/archive2.tar.gz >resultat2.txt
...

read reponse

cat resultat1.txt|grep $reponse 2>error.txt
Cette commande si dessus va t afficher la ligne qui contient $reponse parmis les lignes du fichier resultat1, et sortir les erreurs dans le fichier error.txt
if $?
sa c pour tester si grep a trouvé une ligne
donc ici tu fé l'extraction
else
donc ici tu ne fait pas l'extraction et tu passe au fichier resultat2.txt
cat resultat2.txt|grep $reponse 2>error.txt
if $?
rebelote, tu fé l'extraction
else
aucune des archives ne contient le fichier: tu affiche ce qu'il faut
end if
end if

Bon sorry mais la syntaxe du if j'en ai vu tellement que je ne sais plus comment on fait
Peut etre était ce des {}...mais il me semble que nn.
Man if pour plus d'infos

Merci pour ta rapidité...

J'ai bien pris note de tes remarques !
(man if n'existe pas, c'est dans man bash ;) )
Je pense que tu voulais dire si "$? = 0" -> extraire sinon passé au reste

J'ai modifié mon script ce qui donne maintenant cela



**********************************************************************************************

#liste le contenu de l'archive archive1.tar.gz et le met dans resultat1.txt
tar -tvzf /tmp/lister/archive1.tar.gz > resultat1.txt

#liste le contenu de l'archive archive2.tar.gz et le met dans resultat2.txt
tar -tvzf /tmp/lister/archive2.tar.gz > resultat2.txt

#l'utilisateur entre le nom du fichier qu'il veut extraire
echo -ne "\nTaper le nom du fichier pour le restaurer : "
read reponse

cat resultat1.txt|grep $reponse 2> error.txt
if [ $? = 0 ]
then
tar -C / -xzf /tmp/lister/archive1.tar.gz repertoire/sousrepertoire/${reponse}
else
exit
fi

cat resultat2.txt|grep $reponse 2> error.txt
if [ $? = 0 ]
then
tar -C / -xzf /tmp/lister/archive2.tar.gz repertoire/sousrepertoire/${reponse}
else
exit
fi


*******************************************************************************************




Mais il me dit que: "le shell a retourné 1"

(ps: il ne me liste plus les archives ... =O =( )

Merci,
Messages postés
1542
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
8 avril 2016
154
Oui normal la liste est redirigée dans des fichiers....tu a du voir deux fichiers se créer
Sinon le test d'égalité c pas [$? = 0] mais [$? -eq 0] il me semble
SInon pour l'algo tourne le plutot comme sa
cat resultat1.txt|grep $reponse 2> error.txt
if [ $? = 0 ]
then
tar -C / -xzf /tmp/lister/archive1.tar.gz repertoire/sousrepertoire/${reponse}
else
cat resultat2.txt|grep $reponse 2> error.txt
if [ $? = 0 ]
then
tar -C / -xzf /tmp/lister/archive2.tar.gz repertoire/sousrepertoire/${reponse}
else
exit(40)
fi
fi
Parce que la comme tu l'a fait si il le trouve pas dans la premiere archive il quitte sans tester la deuxieme

Le exit(40) c pour sortir avec un autre code que 1 paece que le code d'erreur 1 est assez courant dans plusieurs commandes: du cou tu pourra tester la variable $? pour savoir si c ton script qui merde ou bien si c'est une commande dedans
Merci freto !

Je regarde ça dès lundi matin et je te tiens au courant ;)
Hum .. il me met toujours la même erreur..

Je laisse ceci pour un moment.. Mais j'ai une autre question:


Je voudrais créer un script qui permet d'afficher le nom d'hôte de la machine dans un fichier texte à part:
hostname -d > AC000021.txt

Ca c'est bon.. Mais je voudrais qu'il me l'affiche, dans le fichier toujours, mais après un petit message ( du style: "Le nom d'hote pour cette machine est: "

Saurais-tu comment faire ?

Merci en tout cas pour tes réponses,

Xavier
Messages postés
1542
Date d'inscription
vendredi 6 juillet 2007
Statut
Membre
Dernière intervention
8 avril 2016
154
tu peut faire
echo "Le nom d'hote pour cette machine est:" | hostname -d |tee AC000021.txt
ou encore
echo "Le nom d'hote pour cette machine est:" $(hostnale -d)>AC000021.txt
ou encore
nom=hostname -d
echo "Le nom d'hote pour cette machine est:" $nom > AC000021.txt

Pour ton erreur, as tu essayé de tester $? de la manière suivante
if $? then
Parce que vu qu'il va effectuer le test en booleen, sa devrait passer
Mais si sa fonctionne pas, bah la va falloir trouver autre chose
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 838
Salut,
echo "Le nom d'hote pour cette machine est : $(hostname -d)" > AC000021.txt
;-))
Merci beaucoup ! je n'étais pas loin..

Je dois en fait créer un fichier texte qui affiche tout les détails d'un serveur (tel que: le nom, la version, la date, les différents patchs installés, les différents logiciels installés, les dernières mises à jour effectuées, etc..)

Donc voilà, je vous remercie ! Je reviendrais vers vous si j'ai des blocages =)

Xavier