IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Exclure des éléments dans un traitement de fichiers


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut Exclure des éléments dans un traitement de fichiers
    Bonjour

    Je souhaite exclure des fichiers et dossiers de mon traitement, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    fichier_exclure=`cat '/var/www/localhost/mon/chemin/mon_dossier/elements_a_exclure.txt'`
     
    # si on trouve une virgule dans le fichier alors on separe les elements dans un tableau
    old="$IFS"
    IFS=,
    set $fichier_exclure
    IFS="$old"
     
    for exclure in "$@"
    do
     
    	if echo "$i" |grep $exclure >/dev/null 2>&1
    	then 
    		echo ""	
    	else
                    # traitement
           fi
    done
    Seulement ça ne semble pas fonctionner, car tous les fichiers sont traités, au lieu d'exclure ceux qui sont dans elements_a_exclure.txt. Voici comment j'ai écrit dans ce dernier :
    jquery,*.css,*.ini,*.jpg,*.png,*.gif,*.sql,*.swf,*.pdf

    Y a t il une erreur dans le code ou dans elements_a_exclure.txt ? J'ai oublié quelque chose ?

    Cordialement,
    Ginger

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    D'où elle sort cette variable ???

    A mon avis tu t'y prends très mal pour faire ta sauce

    Quand on saura ce que représente "$i", on pourra sûrement t'en dire plus...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    J'ai juste pas mis tout le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #!/bin/sh
     
    # je reçois en parametre le dossier à traiter
    tabdossier=$*
    for d in $tabdossier
    do
            tmp=${d%/*}
    	tmp=${tmp##*/}
    	explorer=`find $d -name "*.*"`
    	if [[ $explorer = "" ]]
    	then
    		echo "<br /><b>Le dossier $tmp ne possède pas de fichiers. </b><br />"
    	else
    		echo "<br /><b>Dossier $tmp en cours de traitement ... </b><br />"
    	fi
     
    	for i in $explorer
    	do
                    tmp2=${i#*$tmp}
    		tmp3=${tmp2#/}
     
                    # on recupere les elements a exclure
                    fichier_exclure=`cat '/var/www/localhost/mon/chemin/mon_dossier/elements_a_exclure.txt'`
     
                    # si on trouve une virgule dans le fichier alors on separe les elements dans un tableau
                    old="$IFS"
                    IFS=,
                    set $fichier_exclure
                    IFS="$old"
     
                    for exclure in "$@"
                    do
     
    	                if echo "$i" |grep $exclure >/dev/null 2>&1
    	                then 
    		                echo ""	
    	                else
                                   # traitement
                            fi
                  done
            done
    done
    exit 0;

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Quel est le but exact de ton script, à part celui d'exclure certains fichiers du traitement ?

    Parce que un simple grep récursif en excluant les motifs souhaités devrait faire l'affaire...

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    il est possible d'utiliser sed pour convertir le contenu du fichier (elements...txt) en une 'regex compatible' avec ce que peut comprendre find;
    passer cette 'regex compatible' à find pour qu'il fasse exécuter le «Traitement».

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    Salut

    Merci pour vos réponses

    @zipe31 : je regardes comment faire en grep

    @N_BaH : je ne comprend pas ce que tu veux dire

    Et si je fais quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # je remplace cette ligne : 
    # explorer=`find $d -name "*.*"`
     
    # Par exemple : exclure les fichiers dont l'extension est jpg
    explorer=`find . ! -name "*.jpg"`
    Mais comment exclure plusieurs fichiers en même temps ainsi que des dossiers également ? (d'où l(intérêt de stocker les éléments à exclure dans un fichier à part, on peut en rajouter facilement de cette manière...)

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    c'est plus facile à montrer qu'à décrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;N;s/[\n ,]/|/g; s/\*\./.*\\./g;bx' exclure.txt )" -exec sh -c 'echo "Traitement $1"' {} {} \;

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    J'ai testé ton code N_BaH, ça me renvoie tous les fichiers du dossier traité, alors peut-être que j'ai mal écrit les éléments à exclure dans le fichier exclure.txt ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jQuery,jqueryui,*.css,*.ini,*.jpg,*.png,*.gif,*.sql,*.swf,*.pdf,*.xml,*.txt,*.plist,*.icns,*.rsrc,*.strings,*.nib,*.DS_Store,*.buildpath,*.project,*.BCI

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Re-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $ cat plop 
    jQuery,jqueryui,*.css,*.ini,*.jpg,*.png,*.gif,*.sql,*.swf,*.pdf,*.xml,*.txt,*.plist,*.icns,*.rsrc,*.strings,*.nib,*.DS_Store,*.buildpath,*.project,*.BCI
     
    $ sed -i.bak 's/,/\n/g' plop 
     
    $ cat plop 
    jQuery
    jqueryui
    *.css
    *.ini
    *.jpg
    *.png
    *.gif
    *.sql
    *.swf
    *.pdf
    *.xml
    *.txt
    *.plist
    *.icns
    *.rsrc
    *.strings
    *.nib
    *.DS_Store
    *.buildpath
    *.project
    *.BCI
     
    $ egrep -rl --exclude-from=plop '' /home/jp/Documents/
    Me renvoie la liste de tous les fichiers récursivement contenus dans "/home/jp/Documents/", à l'exception de ceux mentionnés dans "plop"

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    dans l'expression sed, il faut déplacer le N, juste avant l'indication de branchement b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find [...] $(sed :x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' exclure.txt) [...] \;

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    Ah du coup ça marche ta première solution, super merci !

    j'ai une autre question qui n'a rien à voir, mais ça reste dans le sujet :
    Est-ce qu'il existe un moyen d'échapper tous les espaces d'une chaîne s'ils existent en sh ? En l'occurence ici il s'agirait de protéger les espaces dans $tabdossier…

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    utilise des guillemets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for item in "$tabdossier"/*; do ...
    ...
    ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    J'ai essayé, en fait le pb ne vient peut-être pas du fait qu'il faille échapper les espaces dans le nom du dossier, quoi que...

    J'ai affiché le chemin envoyé en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabdossier=$*
    echo "le dossier est $tabdossier <br />"
    Puis ensuite le résultat de ces commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tmp=${d%/*}
    echo "tmp est $tmp <br />"
     
    tmp=${tmp##*/}
    echo "tmp suite est $tmp <br />"
    Il me renvoie ceci :
    le dossier est /mon/chemin/dossier1/dossier2/dossier test a recuperer/
    tmp est /mon/chemin/dossier1/dossier2
    tmp suite est dossier2
    Il est sensé récuperer "dossier test a recuperer", pas "dossier2"… Quand je n'ai pas d'espaces dans le nom du dossier, pas de pb il récupère le bon… C'est pour ça que je voulais échapper les espaces.

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ tabdossier="/mon/chemin/dossier1/dossier2/dossier test a recuperer/"
    $ tmp="${tabdossier%/}" 
    $ tmp="${tmp##*/}" 
    $ echo "$tmp"
    dossier test a recuperer

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    ::::: EDIT :::::

    J'ai re modifié le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tabdossier="$*"
    for d in "$tabdossier"
    do
    	tmp="${tabdossier%/*}"
    	tmp="${tmp##*/}"
            # suite du code…
    done
    je récupère bien le bon dossier mais ma variable $explorer renvoie toujours vide si je l'écris comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "Traitement $1"' {} {} \;`
    Si je l'écris comme j'avais fait au début, ça marche si le dossier n'a pas d'espaces dans son nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    explorer=`find $tabdossier -name "*.*"`

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    Je n'ai toujours pas trouvé de solution

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    on reprend depuis le début :
    tu veux effectuer des opérations sur certains fichiers dans un dossier donné en paramètre, dont l'extension n'est pas "décrite" dans un fichier
    ...
    ?

    Corriger ton script n'est peut-être pas suffisant, il faut peut-être repenser tout le script.
    Et pour ça, il faut détailler ce qu'il faut faire.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    Bonjour

    Oui voilà il s'agit d'effectuer des opérations sur les fichiers dont l'extension n'est pas en .jpg par exemple, dans le dossier passé en paramètre. Donc pour l'instant voici le script qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #!/bin/sh
    tabdossier="$*"
    for d in "$tabdossier"
    do
    	tmp="${tabdossier%/*}"
    	tmp="${tmp##*/}"
    	explorer=`find $tabdossier -name "*.*"`
    	if [[ $explorer = "" ]]
    	then
    		echo "<br /><b>Le dossier $tmp ne possède pas de fichiers. </b><br />"
    	else
    		echo "<br /><b>Dossier $tmp en cours de traitement ... </b><br />"
    	fi
    	for i in $explorer
    	do
    		# traitement
    	done
    done
     
    exit 0;
    Si le dossier passé en paramètre ne possède pas d'espaces, il affiche "Le dossier dossierUnTel ne possède pas de fichiers. " fait le traitement, sinon il récupère bien le nom de ce dossier ("Dossier dossier Un Tel en cours de traitement ...") mais ne fait pas le traitement…

    Et ce qui reste à réussir à faire :
    - Traiter les fichiers dans le dossier dont le nom peut avoir des espaces (1)
    - Traiter les fichiers dont l'extension n'est pas en .gif par exemple (2)


    :::EDIT:::

    (2)
    J'ai réussi à exclure les fichiers qui se trouvent dans elements_a_exclure.txt, mais pas les dossiers qui s'y trouvent, il doit y avoir quelque chose à rajouter au code sed que tu m'avais donné N_BaH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "$1"' {} {} \;`
    elements_a_exclure est écrit de cette manière pour que ça fonctionne :
    *.css,*.ini,*.jpg,*.png,*.gif,*.sql,*.swf,*.pdf,*.xml,*.txt,*.plist,*.icns,*.rsrc,*.strings,*.nib,*.DS_Store,*.buildpath,*.project,*.BCI,*.xcf,*.bmp,*.sh,jquery,jQuery,jqueryui

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    Bonjour

    J'essaie de comprendre pourquoi ça ne marche pas pour les dossiers contenant un ou des espaces dans leurs noms, je crois savoir d'où vient le problème.

    En effet dans le code si j'écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "find $tabdossier -type f -regextype posix-extended ! -iregex \"$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )\" -exec sh -c 'echo \"$1\"' {} {} \;"
    Ca renvoie ça pour un dossier qui contient des espaces :
    find /mon/chemin/projet/Mon dossier espaces/ -type f -regextype posix-extended ! -iregex ".*\.css|.*\.ini|.*\.jpg|.*\.png|.*\.gif|.*\.sql|.*\.swf|.*\.pdf|.*\.xml|.*\.txt|.*\.plist|.*\.icns|.*\.rsrc|.*\.strings|.*\.nib|.*\.DS_Store|.*\.buildpath|.*\.project|.*\.BCI|.*\.xcf|.*\.bmp|.*\.sh|jquery" -exec sh -c 'echo "/mon/chemin/projet/Mon"' {} {} \;
    Contre ceci quand il n'y a pas d'espaces :
    find /mon/chemin/projet/monDossier/ -type f -regextype posix-extended ! -iregex ".*\.css|.*\.ini|.*\.jpg|.*\.png|.*\.gif|.*\.sql|.*\.swf|.*\.pdf|.*\.xml|.*\.txt|.*\.plist|.*\.icns|.*\.rsrc|.*\.strings|.*\.nib|.*\.DS_Store|.*\.buildpath|.*\.project|.*\.BCI|.*\.xcf|.*\.bmp|.*\.sh|jquery" -exec sh -c 'echo "/mon/chemin/projet/monDossier"' {} {} \;
    Donc $1 interprète l'espace comme un séparateur ?
    J'ai essayé de l'écrire de différentes manières pour protéger le contenu de $1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "$1"' {} {} \;`
     
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "\"$1\""' {} {} \;`
     
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "${1}"' {} {} \;`
     
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "'$1'"' {} {} \;`
     
    explorer=`find $tabdossier -type f -regextype posix-extended ! -iregex "$(sed ':x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' elements_a_exclure.txt )" -exec sh -c 'echo "`$1`"' {} {} \;`
    Mais ça ne change apparemment rien…

    Sinon autre problème, l'exclusion fonctionne pour les fichiers mais pas pour les dossiers (elements_a_exclure.txt …)

  20. #20
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    UMQ!* utilise des guillemets pour tes variables !

    normalement, la commande find, que je t'ai donnée plus haut, devrait faire le boulot de ton script; j'avais mis echo "Traitement", il fallait le remplacer par le traitement que tu veux faire subir aux fichiers.


    * Use More Quotes!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [JDOM] Ajouter des éléments dans un fichier XML
    Par pitchu dans le forum Format d'échange (XML, JSON...)
    Réponses: 14
    Dernier message: 25/12/2015, 11h06
  2. Réponses: 6
    Dernier message: 17/11/2013, 21h32
  3. Réponses: 0
    Dernier message: 27/08/2012, 12h21
  4. [Encodage] Un classique : prendre des éléments dans un fichier texte
    Par DkA59 dans le forum Langage
    Réponses: 13
    Dernier message: 02/04/2011, 16h17
  5. [swing] disposition des éléments dans un GridLayout
    Par al85 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 11/02/2005, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo