Précédent   Forum des professionnels en informatique > Systèmes > Linux
Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/10/2011, 11h35   #1
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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 :
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
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/10/2011, 12h30   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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...
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 15h09   #3
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
J'ai juste pas mis tout le code :
Code :
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;
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/10/2011, 16h29   #4
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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...
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 05h23   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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».
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 10h08   #6
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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 :
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...)
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 10h16   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
c'est plus facile à montrer qu'à décrire :
Code :
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"' {} {} \;
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 10h32   #8
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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 :
jQuery,jqueryui,*.css,*.ini,*.jpg,*.png,*.gif,*.sql,*.swf,*.pdf,*.xml,*.txt,*.plist,*.icns,*.rsrc,*.strings,*.nib,*.DS_Store,*.buildpath,*.project,*.BCI
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 10h42   #9
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Re-

Code :
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"
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 11h40   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
dans l'expression sed, il faut déplacer le N, juste avant l'indication de branchement b :
Code :
find [...] $(sed :x;s/[\n ,]/|/g; s/\*\./.*\\./g;N;bx' exclure.txt) [...] \;
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 11h49   #11
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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…
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 12h23   #12
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
utilise des guillemets :
Code :
for item in "$tabdossier"/*; do ...
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 14h34   #13
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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 :
1
2
tabdossier=$*
echo "le dossier est $tabdossier <br />"
Puis ensuite le résultat de ces commandes :
Code :
1
2
3
4
5
tmp=${d%/*}
echo "tmp est $tmp <br />"
 
tmp=${tmp##*/}
echo "tmp suite est $tmp <br />"
Il me renvoie ceci :
Citation:
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.
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 14h56   #14
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Code :
1
2
3
4
5
$ tabdossier="/mon/chemin/dossier1/dossier2/dossier test a recuperer/"
$ tmp="${tabdossier%/}" 
$ tmp="${tmp##*/}" 
$ echo "$tmp"
dossier test a recuperer
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 15h49   #15
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
::::: EDIT :::::

J'ai re modifié le code :
Code :
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 :
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 :
1
2
 
explorer=`find $tabdossier -name "*.*"`
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 15h44   #16
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
Je n'ai toujours pas trouvé de solution
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 21h51   #17
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 14h25   #18
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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 :
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 :
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 :
Citation:
*.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
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 11h14   #19
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 105
Points : 31
Points : 31
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 :
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 :
Citation:
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 :
Citation:
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 :
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 …)
ginger4957 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 11h47   #20
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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!
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h51.


 
 
 
 
Partenaires

Hébergement Web