Rechercher : dans
Par :

Shell | lister le contenu d'un repertoire !!

Dernière réponse le 9 sep 2008 à 11:20:12 nouabi, le 6 jui 2007 à 16:57:50 
 Signaler ce message aux modérateurs

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 Proverbe Chinois : Casser un cruche vide sur votre tête, si ça sonne creux, n'en déduisez pas seule
que c'est la cruche qui est vide ... :-D

Configuration: Windows Vista
Firefox 2.0.0.4

Meilleures réponses pour « Shell | lister le contenu d'un repertoire !! » dans :
[MS-Dos] Lister le contenu d'un répertoire dans un fichier VoirIl peut s'avérer pratique d'effectuer le listage d'un ou plusieurs répertoires dans un fichier, afin de tenir par exemple un catalogue de fichiers. Sous MS-Dos (ou sous Windows en ouvrant une fenêtre d'invite de commande MS-Dos) il est possible...
[Windows] Obtenir la liste des fichiers d'un dossier VoirLister le contenu d'un dossier Voici une astuce simple qui permet de lister le nom des fichiers contenus dans un répertoire. Vous pourrez obtenir en un clic les titres de vos chansons, de vos photos, etc. dans un fichier...
[PHP] Lister le contenu d'un répertoire VoirGrâce à PHP, il est possible d'afficher le contenu d'un répertoire et de ses sous-répertoires. Voici ci-dessous une fonction permettant de parcourir récursivement les répertoires et sous-répertoires et d'en afficher les fichiers : function...
Utilisation de la commande ftp VoirLe protocole FTP FTP (File Transfer Protocol) est un protocole, c'est-à-dire un langage standard de communication entre deux machines, permettant à des machines de types différents (ou dont le système d'exploitation est différent) de transférer des...
Les commandes FTP VoirLe protocole FTP FTP (File Transfer Protocol) est un protocole, c'est-à-dire un langage standard de communication entre deux machines, permettant à des machines de types différents (ou dont le système d'exploitation est différent) de...
Fichiers et répertoires VoirLes fichiers sous DOS Sur un ordinateur les informations sont stockées dans des fichiers. Lorsqu'on exécute un programme, MS-DOS traite les informations situées dans le fichier et les transmet au système. Sous MS-DOS chaque fichier peut être aussi...

1

freto, le 6 jui 2007 à 17:12:36

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

Répondre à freto

2

[Dal], le 6 jui 2007 à 18:34:05

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 :
http://tldp.org/LDP/abs/html/fto.html
http://tldp.org/LDP/abs/html/testconstructs.html
http://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)

Répondre à [Dal]

3

nouabi, le 9 jui 2007 à 09:15:33

Salut

Ton script test si le fichier 'toto1' existe ! Je voudrai qu'il test la présence d'un fichier quelconque !
Mon problème est surtout la !

Merci d'avance Proverbe Chinois : Casser un cruche vide sur votre tête, si ça sonne creux, n'en déduisez pas seule
que c'est la cruche qui est vide ... :-D

Répondre à nouabi

4

gorkimat, le 9 jui 2007 à 10:32:33
  • +2

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

Répondre à gorkimat

6

nouabi, le 9 jui 2007 à 10:34:30

Je test ca !!!
Merci Proverbe Chinois : Casser un cruche vide sur votre tête, si ça sonne creux, n'en déduisez pas seule
que c'est la cruche qui est vide ... :-D

Répondre à nouabi

7

nouabi, le 9 jui 2007 à 10:40:02

Oki ca marche merci beaucoup ! Proverbe Chinois : Casser un cruche vide sur votre tête, si ça sonne creux, n'en déduisez pas seule
que c'est la cruche qui est vide ... :-D

Répondre à nouabi

5

nouabi, le 9 jui 2007 à 10:33:03
  • +1

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 Proverbe Chinois : Casser un cruche vide sur votre tête, si ça sonne creux, n'en déduisez pas seule
que c'est la cruche qui est vide ... :-D

Répondre à nouabi

8

ekra, le 9 jui 2007 à 11:40:07

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. Ceci est une signature.

Répondre à ekra

9

xavyeii, le 5 sep 2008 à 12:16:03

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

Répondre à xavyeii

10

freto, le 5 sep 2008 à 14:20:58

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.
What's tiny, and yellow and very very dangerous?????
A canary with the super-user password.
Mouhahahaha

Répondre à freto

11

xavyeii, le 5 sep 2008 à 15:46:06

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

Répondre à xavyeii

12

freto, le 5 sep 2008 à 15:54:44

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

What's tiny, and yellow and very very dangerous?????
A canary with the super-user password.
Mouhahahaha

Répondre à freto

13

xavyeii, le 5 sep 2008 à 16:26:57

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,

Répondre à xavyeii

14

freto, le 5 sep 2008 à 16:52:52

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
What's tiny, and yellow and very very dangerous?????
A canary with the super-user password.
Mouhahahaha

Répondre à freto

17

xavyeii, le 5 sep 2008 à 21:12:01

Merci freto !

Je regarde ça dès lundi matin et je te tiens au courant ;)

Répondre à xavyeii

18

xavyeii, le 9 sep 2008 à 11:01:53

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

Répondre à xavyeii

19

freto, le 9 sep 2008 à 11:05:48

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
What's tiny, and yellow and very very dangerous?????
A canary with the super-user password.
Mouhahahaha

Répondre à freto

20

jipicy, le 9 sep 2008 à 11:06:24

Salut,

echo "Le nom d'hote pour cette machine est : $(hostname -d)" > AC000021.txt
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

21

 xavyeii, le 9 sep 2008 à 11:20:12

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

Répondre à xavyeii