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 27/09/2006, à 21:52

Arkezis

[BASH] Lister les fichiers d'un dossier !

Bonsoir à vous !
Premiere fois que je post dans cette section qui a belle et bien l'air trés "pro" !
Que d'émotions wink

bref !

Voila, je tourne sous Linux depuis quelques semaines et ai souvent besoin de lister les fichiers de certains de mes dossiers !
Seuelement, sous Windows j'avais trouvé une commande a éxécuter mais sous Linux ... ben nan !
Mais en fait, je suis un petit flémard qui travaille beaucoup car j'aime automatiser mes actions mais seulement si en faisant cela j'apprend !
Donc voila !
J'ai un petit bouquin sur Linux ou il y a une "initiation" au Bash !

Alors je vais vous montrer ce que j'en ai tiré et je voudrais que vous m'aidiez pour mon script !
Tapez moi dessus j'ai vraiment envie d'apprendre le bash !!!

#!/bin/bash

#Description du script
#####################################
#Ce script permet de lister les fichiers d'un dossier dans un nouveau fichier

#Declaration des constantes
#####################################
FICHIER_LISTE=~/Desktop


#Etape 1 : Trouver le dossier avec les fichiers à lister
#####################################

DOSSIER=`kdialog --getexistingdirectory ~`


#Etape 2 : On stocke la liste des fichiers du dossier en question dans la variable $LISTE
######################################
LISTE=ls $DOSSIER

#Etape 3 : On créé un nouveau fichier avec dedans cette fameuse liste
######################################

echo $LISTE


#Etape X : On enregistre le fichier avec la liste
#######################################

`kdialog --getsavefilename ~`


#Etape 5 : On envoie un zouli message disant que c'est gagné !
#######################################

`kdialog --msgbox "Et voila, votre fichier s'apelle bien $FICHIER et est stocké dans $DOSSIER !" ~`

Voila ! Merci de m'aider smile


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#2 Le 27/09/2006, à 22:06

Codu

Re : [BASH] Lister les fichiers d'un dossier !

Salut,

Je ne peux pas t'aider pour kdialog que je ne connais pas bien mais par contre tu devrais plutôt écrire

LISTE=`ls $DOSSIER`

Les "backquotes" voulant dire : "il s'agit d'une commande et je m'intéresse au RESULTAT (son output) de cette commande". Sans cela, tu ne fais que mettre le texte "ls $DOSSIER" dans la variable.

#3 Le 27/09/2006, à 22:10

Codu

Re : [BASH] Lister les fichiers d'un dossier !

Et pour continuer, pour sauve le résultat dans un fichier, tu peux écrire

echo $LISTE >$FICHIER

Et alors on comprend que la variable $LISTE n'est pas utile et que le tout peut devenir

ls $DOSSIER >$FICHIER

#4 Le 27/09/2006, à 22:42

Arkezis

Re : [BASH] Lister les fichiers d'un dossier !

Hum !

j'ai fait des modifs merci a Codu mais ... j'ai rien dans mon fichier ... :s !
Alors c'est au moment de l'écriture qu'il écrit pas !
Comment faire ?
Ne dois je pas plutot créer le dossier avant et APRES écrire dedans ?

#!/bin/bash

#Description du script
#####################################
#Ce script permet de lister les fichiers d'un dossier dans un nouveau fichier

#Declaration des constantes
#####################################
FICHIER_LISTE=~/Desktop


#Etape 1 : Trouver le dossier avec les fichiers à lister
#####################################

DOSSIER=`kdialog --getexistingdirectory ~`

#Etape 2 : On stocke la liste des fichiers du dossier en question dans le fichier qu'on enregistre
#####################################

`ls $DOSSIER` >`kdialog --getsavefilename ~`

#Etape 5 : On envoie un zouli message disant que c'est gagné !
#######################################

`kdialog --msgbox "Et voila, votre fichier s'apelle bien $FICHIER " ~`


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#5 Le 27/09/2006, à 22:55

Arkezis

Re : [BASH] Lister les fichiers d'un dossier !

J'ai trouvé !

Super simple:

#!/bin/bash

#Description du script
#####################################
#Ce script permet de lister les fichiers d'un dossier dans un nouveau fichier

#Declaration des constantes
#####################################
FICHIER_LISTE=~/Desktop


#Etape 1 : Trouver le dossier avec les fichiers à lister
#####################################

DOSSIER=`kdialog --getexistingdirectory ~`

#Etape 2 : On stocke la liste des fichiers du dossier en question dans le fichier qu'on enregistre
#####################################

dir $DOSSIER >`kdialog --getsavefilename ~`

#Etape 5 : On envoie un zouli message disant que c'est gagné !
#######################################

`kdialog --msgbox "Et voila, votre fichier a bien été créé !" ~`

Suffisait de pas mettre entre `` !!


Donc voila, ce script permet de lister les fichiers d'un dossier !
Pratique quand on veut par exemple donner la liste de ses mp3s a ses copains ou bien lister les fichiers php de son site pour mieux expliquer au collègues wink


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#6 Le 28/09/2006, à 00:41

kaworu

Re : [BASH] Lister les fichiers d'un dossier !

pas mal wink
le problème c'est que kdialog n'est pas très portable, qqn sous Gnome ou autre DE/WM que KDE ne pourra pas l'excuter.
s'il te plait, remplace dir par ls.

Je te donne un tip pour les scrpits bash. Perso je procède en 4 étapes (je fais un exemple avec la connection wifi) :

1) écrire toutes les commandes à la suite

iwconfig eth1 essid "FOO" key "123"
ifconfig eth1 up
dhclient eth1

2) mettre des variables :

INTERFACE="eth1"
ESSID="FOO"
KEY="123"
iwconfig ${INTERFACE} essid ${ESSID} key ${KEY}
ifconfig ${INTERFACE} up
dhclient ${INTERFACE}

3) mettre des tests, pour que ce soit plus portable :

INTERFACE="eth1"
ESSID="FOO"
KEY="123"
# test pour voir si on est root 
[ $UID -ne 0 ] && echo "Vous devez être root pour lancer ce script && exit 1
# test pour voir si wireless-tools est installé
[ ! $(which iwconfig &>/dev/null) ] && echo "ce script a besoin de wireless tools" && exit 1
iwconfig ${INTERFACE} essid ${ESSID} key ${KEY}
ifconfig ${INTERFACE} up
[ ! $(which dhclient &>/dev/null) ] && echo "ce script a besoin de dhclient" && exit 1
dhclient ${INTERFACE}
if [ $? -ne 0 ]; then
    echo "La requête DHCP à échouée ! :("
    exit 1
else
    _ip=$(ifconfig ${INTERFACE} | grep "inet adr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
    echo "Votre adresse IP : ${_ip}
fi
exit 0

4) finalement mettre les variables dans un fichier et faire des fonctions pour la lisibilité :

#!/bin/bash

function my_which() {
    if which $1 &>/dev/null ; then
        return 0
    else
        echo "ce script à besoin de la commande $1"
        exit 1
    fi
}

function dhcp_request() {
    my_which dhclient
    dhclient ${INTERFACE}
    if [ $? -ne 0 ]; then
        echo "La requête DHCP à échouée ! :("
        exit 1
    else
        local _ip=$(ifconfig ${INTERFACE} | grep "inet adr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
        echo "Votre adresse IP : ${_ip}
    fi
}

function my_iwconfig() {
    my_which iwconfig
    iwconfig ${INTERFACE} essid ${ESSID} key ${KEY}
    ifconfig ${INTERFACE} up
}


### debut du script ###

# on load le fichier de configuration :
if [ -f "/etc/mon_fichier_de_configuration" ]; then
    source "/etc/mon_fichier_de_configuration"
else
   # remplir des valeurs par défaut OU afficher une erreur et exit 1
fi
if [ "$USER" = "root" ]; then
    my_iwconfig
    dhcp_request
else
    echo "Vous devez être root pour éxectuer ce script"
    exit 1
fi
exit 0

avec un fichier de configuration qui ressemble à ça :

INTERFACE="eth1"
ESSID="FOO"
KEY="123"

Enjoy !


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#7 Le 28/09/2006, à 02:31

kezar

Re : [BASH] Lister les fichiers d'un dossier !

j'ai vaguement suivi mais un

liste (à appeler par liste [chemin du répertoire à lister] [chemin du fichier liste])

#!/bin/sh
ls -al $1 > $2

suffirait non ? En modifiant pour faire plus simple d'utilisation :


liste (à appeler par liste [chemin du répertoire à lister] [chemin du fichier liste])

#!/bin/sh
DIR=${./:$1}
FIC=${./liste.txt:$2}
ls -al $(DIR) > $(FIL)

Vouala ^^ le DIR=${./:$1} permet de donner une valeur par défaut à une variable si un paramètre est laissé vide.

Dernière modification par kezar (Le 28/09/2006, à 11:46)

Hors ligne

#8 Le 28/09/2006, à 06:07

Arkezis

Re : [BASH] Lister les fichiers d'un dossier !

Merci de m'aider en me montrant vos scripts mais ... pourriez vous plus les commenter ? ^^

Je connais trés peu de commande bash donc j'ai beaucoup de mal a lire vos scripts tongue

Merci encore wink


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#9 Le 28/09/2006, à 09:58

kaworu

Re : [BASH] Lister les fichiers d'un dossier !

#!/bin/bash

cette partie doit être dans tous les script bash. Elle dit que l'interpréteur correct pour ce script est /bin/bash, ce qui permet de l'éxecuter de cette façon ./mon_script sans dire dans quel language il est écris, car l'interpréteur est mentionner à l'intérieur du script. on peut faire pareil en perl,ruby,python (en faite quasi tous les languages scripts).

function my_which() {
    if which $1 &>/dev/null ; then
        return 0
    else
        echo "ce script à besoin de la commande $1"
        exit 1
    fi
}

Cette fonction sert à savoir si une commande est disponible.
ligne 1: la commande which iwconfig (par exemple) va te renvoyer le path vers l'éxecutable et terminer en renvoyant 0 (essaye avec des commandes), soit te renvoyer un truc du genre :
"no iwconfig in : ( $PATH )"
et terminer en renvoyant 1. Nous on ne veut que savoir si ça se passe bien (c'est à dire si la commande existe) et non pas où elle se trouve, donc on rajoute &>/dev/null ce qui redirige l'output de la commande vers /dev/null (c'est à dire vers rien, c'est un device qui sert uniquement à ça).
$1 est le 1er argument donné quand on apelle cette fonction, on s'attend donc à recevoir au min 1 argument.
on a donc (en pseudo-code) :

SI la commande $1 existe (si which se passe bien); ALORS
    on retourne 0
AUTREMENT
    on affiche une erreur et on quitte
FIN_SI

---------------------------------------------

function dhcp_request() {
    my_which dhclient
    dhclient ${INTERFACE}
    if [ $? -ne 0 ]; then
        echo "La requête DHCP à échouée ! :("
        exit 1
    else
        local _ip=$(ifconfig ${INTERFACE} | grep "inet adr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
        echo "Votre adresse IP : ${_ip}
    fi
}

cette fonction sert à faire une requête DCHP.
ligne 1 : On test d'abord si le programme dhclient est installé (grâce à la 1ère fonction que l'on à écrite wink )
ligne 2 : on lance la requête DHCP
ligne 3 : si la requête à échoué (si elle ne retourne pas 0, sachant que la variable $? est l'état de sortie de la dernière commande, ici la requête dhcp) on affiche une erreur et on quite (lignes 4-5)
ligne 7 : autrement on récupère l'adresse IP et on l'affiche (man grep, man cut)
--------------------------------------------------------------------------------------------

function my_iwconfig() {
    my_which iwconfig
    iwconfig ${INTERFACE} essid ${ESSID} key ${KEY}
    ifconfig ${INTERFACE} up
}

rien de compliqué dans cette fonction qui sert juste à configurer la carte wifi.
ligne 1 : on test si la commande iwconfig est là (si le paquet wireless-tools est installé). classique quoi wink
lignes 2-3 : on configure la carte

--------------------------------------------------------------------------------------------

### debut du script ###

# on load le fichier de configuration :
if [ -f "/etc/mon_fichier_de_configuration" ]; then
    source "/etc/mon_fichier_de_configuration"
else
   # remplir des valeurs par défaut OU afficher une erreur et exit 1
fi
if [ "$USER" = "root" ]; then
    my_iwconfig
    dhcp_request
else
    echo "Vous devez être root pour éxectuer ce script"
    exit 1
fi
exit 0

lignes 1-5 : si le fichier /etc/mon_fichier_de_configuration existe, on va le "sourcer", c'est à dire executer tout le code qui est contenu (le code est "ajouté" au script). Ce fichier contient les variables dont on a besoin, comme ça un utilisateur n'as pas besoin de toucher au code source du programme mais uniquement un fichier de conf qui est séparé.
lignes 2-end : on test si le user qui éxecute le script à les droits root, et si c'est bon on lance les 2 méthode pour se connecter, sinon on affiche une erreur puis on exit.

ouf fini tongue


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#10 Le 28/09/2006, à 11:52

kezar

Re : [BASH] Lister les fichiers d'un dossier !

Pour ma part rien de bien complexe

#!/bin/sh                    # Interpréteur à utiliser
DIR=${./:$1}              # On définit la variable DIR ayant pour valeur ./ par défaut et le premier
                                   # argument passé au script s'il existe
FIC=${./liste.txt:$2}    # idem avec le deuxième argument
ls -al $(DIR) > $(FIL)     # On liste le contenu de DIR (./ par défaut ou le premier argument) en
                                    # affichant les fichiers cachés (-a) et en mode détaillé (-l) et on redirige
                                    # la sortie texte vers un fichier (./liste.txt par défaut ou l'argument 2)

N'oublie pas de rajouter un flag x à tes scripts wink

Hors ligne

#11 Le 28/09/2006, à 20:09

Arkezis

Re : [BASH] Lister les fichiers d'un dossier !

Hum merci à vous !

J'ai encore 2 3 questions ..
Kaworu merci pour ton explication bien détaillé mais tu n'aurais pas quelques scripts plus petit et plus classique car en fait là ca aborde des choses que je ne connais pas donc forcément c'est un peu torp compliqué wink

Kezar, je ne comprend pas ta syntaxe ${./:$1}   , je n'arrive pas a voir a quoi ca correspond !
De plus nul part tu n'apelles une fenetre pour choisir un dossier et l'enregistrer, ca le fait automatiquement ?
Et pareil si tu as des scripts plus simple ...

Auriez vous autrement des bons tutos pour apprendre le bash ?
Merci encore du temps que vous m'accordez!


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#12 Le 28/09/2006, à 21:42

kezar

Re : [BASH] Lister les fichiers d'un dossier !

Mon script s'exécute dans un terminal c'est pour ça. En effet si tu veux faire un interfaçage avec ton wm (zenity sur gnome ou l'équivalent sur kde) il faut faire appel à de nouvelles fonctions.

Là en fait tu copies le source dans un fichier que tu nommes par exemple liste.
Ensuite chmod 700 un truc comme ça, pour ajouter les permissions d'exécution. Autant le copier dans /usr/bin, ou mieux créer un répertoire dans ton home et l'ajouter à ton path afin de stocker tes scripts et d'y avoir accès en permanence.
Ensuite dans un terminal :

liste

enregistre le listing du répertoire dans ./liste.txt

liste /tmp

enregistre le listing du répertoire /tmp dans ./liste.txt

liste /tmp ~/Desktop/a.txt

enregistre le listing du répertoire /tmp dans un fichier a.txt sur le bureau


La syntaxe VARIABLE=${X:Y} permet d'affecter à VARIABLE soit la valeur X si Y n'existe pas ou Y s'il existe. En l'occurrence je l'ai utilisée avec les paramètres passés à la fonction ($0 à $9) pour définir un répertoire à lister par défaut et un fichier de sortie par défaut.

Je te conseille de lire http://www.tldp.org/LDP/abs/html/ et http://www.bsdbooks.net/shells/scripting/index.html (il y a un problème avec le dernier site on dirait) si tu t'intéresses un shell scripting.

Hors ligne

#13 Le 28/09/2006, à 22:00

Arkezis

Re : [BASH] Lister les fichiers d'un dossier !

Ok j'ai compris now !

Sinon j'ai un pb que je n'arrives pas a résoudre, un pb de droit d'accés dans /var/www !
J'ai pas les droits en fait (tout simplement wink) comment je les changes ? (peur de faire une bétise :s)


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#14 Le 28/09/2006, à 22:02

kezar

Re : [BASH] Lister les fichiers d'un dossier !

sudo chown user:group répertoire
sudo chmod flags répertoire

Tu ajoutes un -R pour le mode récursif (descend dans les répertoires).

Hors ligne

#15 Le 30/09/2006, à 12:05

Arkezis

Re : [BASH] Lister les fichiers d'un dossier !

Youhou ca marche !
Merki beaucoup !!

Au fait les tutos que vous m'avez donnés sont en anglais et je suis pas super doué en anglais ! Auriez vous connaissance d'autres tutos ou de bouquins en francais ?


[img=http://arkezis.free.fr/get_firefox_80x15.png][img=http://arkezis.free.fr/get_konqueror_80x15_2.png]
[img=http://arkezis.free.fr/get_kubuntu_80x15_2.png][img=http://arkezis.free.fr/get_openoffice20_80x15.png]
[img=http://arkezis.free.fr/get_php_80x15_2.png][img=http://arkezis.free.fr/wikipedia.png]

Hors ligne

#16 Le 30/09/2006, à 13:26

kezar

Re : [BASH] Lister les fichiers d'un dossier !

Et ben essaye ça http://www.google.com/search?rls=fr&q=programmation+shell&ie=utf-8&oe=utf-8

Hors ligne