Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
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 22/02/2011, 11h26   #1
Invité de passage
 
Inscription : février 2003
Messages : 19
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 19
Points : 1
Points : 1
Par défaut find et conditions changeantes

Bonjour à tous,
Je pensai faire une commande find avec conditions changeantes du type :
Code :
1
2
3
4
5
FILELIST="$(find "$FILTER")"
 
avec $FILTER pouvant être, selon les besoins,
soit FILTER="-name \"*.txt\""
soit FILTER=". type f"
mais cela ne marche pas. La chaîne FILTER n'est pas reconnue par find.

Je peux faire au mieux :
Code :
1
2
FILTER="*.txt"
FILELIST="$(find -name "$FILTER")"
Y a-t-il une solution pour construire dynamiquement les conditions de filtre ?
Brunoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 11h37   #2
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Moi ça marche en faisant :

Code :
1
2
3
4
FILTER="-name "*.txt""
find $FILTER
 
FILELIST=$(find $FILTER)
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 13h52   #3
Invité de passage
 
Inscription : février 2003
Messages : 19
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 19
Points : 1
Points : 1
J'ai oublié de préciser que j'utilise FILELIST dans une boucle for. Le code ressemble plutôt à ça :
Code :
1
2
3
4
5
6
7
 
FILTER="-name \"*.txt\""
FILELIST=$(find "$FILTER")
for filename in $FILELIST
do
...
done
mais cela génère une erreur :
Citation:
find: prédicat inconnu « -name "*.txt" »
J'ai essayé plusieurs écritures différentes sans trouver la formule.
Brunoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 14h00   #4
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Code :
1
2
3
4
5
6
7
 
FILTER="-name "*.txt""
FILELIST=$(find $FILTER)
for filename in "$FILELIST"
do
echo "$filename"
done
Ca trouve même correctement des noms de fichiers avec espaces
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 14h40   #5
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Il manque pas un nom de dossier où chercher quelque part ?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 14h56   #6
Invité de passage
 
Inscription : février 2003
Messages : 19
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 19
Points : 1
Points : 1
Non, je ne pense pas. Car si je teste dans une console :
j'obtiens un résultat
Brunoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 15h21   #7
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,

Essaie en séparant chaque option...

Code :
1
2
3
4
5
6
7
FILTER="-name"
NAME="\"*.txt\""
FILELIST=$(find "$FILTER" "$NAME")
for filename in $FILELIST
do
...
done
__________________
$ 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 22/02/2011, 16h04   #8
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
ça ne va pas l'aider puisque le but est de pouvoir modifier $FILTER

tu devrais utiliser xargs :
Code :
1
2
3
4
5
FILTER=". -name \"*.txt\""
for FILENAME in $(echo $FILTER | xargs find)
do
basename  $FILENAME
done
edit: à adapter car ça ne marchera pas avec des espaces !

comme ceci par exemple :
Code :
1
2
3
4
5
6
FILTER=". -name \"*.txt\""
 
while read N
do
basename "$N"
done < <(echo $FILTER | xargs find)
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 16h18   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 146
Points : 4 146
grrr! on ne fait pas for item in $(command)
!!!
Code :
1
2
3
4
5
6
7
8
9
$ ls -1
my file
my file.txt
my_file.txt
$ filter=( -name '*.txt' )
$ for i in $(find ./ "${filter[@]}"); do echo "$i"; done
./my
file.txt
./my_file.txt
d'autant plus que find dispose d'une option d'action -exec COMMAND \;
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 16h20   #10
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
ouais, je sais, d'où mon edit

par contre, comment tu utilises -exec avec le xargs ?!
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 16h22   #11
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 146
Points : 4 146
ah, mais on n'utilise pas non plus xargs !

find se suffit à lui-même :
Code :
1
2
3
4
$ filter=( -name '*.txt' )
$ find ./ "${filter[@]}" -exec basename {} \;
my file.txt
my_file.txt
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 16h31   #12
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Ouais, j'ai bien vue cette jolie solution, mais j'ai le malheur de travailler sur des vieux unix où je n'ai ni bash, ni des versions récentes des OS...

Donc j'aime bien trouver des solutions marchant sur des trucs vieux :p

Or, ceci marche bien :
Code :
1
2
3
4
5
6
FILTER=". -name \"*.txt\""
 
echo $FILTER | xargs find | while read N
do
basename "$N"
done
mais ça serait plus propre d'utiliser -exec, cela étant, je ne sais pas comment puisque je ne sais pas différencier les {} d'xargs et ceux de -exec
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 16h36   #13
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 146
Points : 4 146
quitte à utiliser des vieux machins : tu as bien conscience que xargs ne fonctionnera pas avec un boulier, n'est-ce pas ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 16h39   #14
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
Citation:
Envoyé par Alek-C Voir le message
ça ne va pas l'aider puisque le but est de pouvoir modifier $FILTER
Mais si, par contre il faudra modifier et FILTER et NAME. Le but était surtout de palier à l'erreur "find: prédicat inconnu « -name "*.txt" » "...
__________________
$ 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 22/02/2011, 17h19   #15
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
soit FILTER="-name \"*.txt\""
soit FILTER=". type f"
Je pense que le but, c'est qu'il puisse potentiellement utiliser des FILTER comportant un ou dix argument(s)

@N_BaH : les sociétés sont en retard, mais quand même
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 17h25   #16
Invité de passage
 
Inscription : février 2003
Messages : 19
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 19
Points : 1
Points : 1
En séparant chaque option comme le suggère zipe31, le code suivant marche :
Code :
1
2
3
4
5
6
7
FILTER="-name"
NAME="\"*.txt\""
FILELIST=$(find "$FILTER" "$NAME")
for filename in $FILELIST
do
...
done
Par contre, je ne comprend pas la différence avec :
Code :
1
2
3
4
5
6
FILTERNAME="-name \"*.txt\""
FILELIST=$(find "$FILTERNAME")
for filename in $FILELIST
do
...
done
...qui ne marche pas. J'avoue que la raison m'échappe.

C'est un bon début mais si les critères changeants de find sont multiples comment faire ?
Alek-C à presque raison, le but est de pouvoir changer les options de find pour construire la commande à l'exécution.
Brunoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 18h14   #17
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
Citation:
Envoyé par Alek-C Voir le message
Je pense que le but, c'est qu'il puisse potentiellement utiliser des FILTER comportant un ou dix argument(s)
Oui ça je l'avais bien compris, et comme j'ai la même erreur qui sort chez moi, voilà pourquoi j'avais proposé cette solution qui effectivement n'est est pas tout a fait une

<ModeDenisotON>
Désolé
<ModeDenisotOFF>
__________________
$ 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 24/02/2011, 17h44   #18
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par Brunoo Voir le message
...
Par contre, je ne comprend pas la différence avec :
...qui ne marche pas. J'avoue que la raison m'échappe.
...
C'est une histoire de gestion des paramètres, mais il faudrait voir le fonctionnement du shell pour avoir les détails du problème je pense...

Mais tu as 2 solutions qui fonctionnent, donc ça ne vaut peut-être pas le coup de trop te compliquer la vie

La solution de N_BaH (où tu utilises un tableau pour les paramètres) si tu es sous un OS ne datant pas de l'age de pierre :
Code :
1
2
FILTER=( -name '*.txt' )
find ./ "${FILTER[@]}" -exec basename {} \;
Ou la mienne pour du vieil Unix (ne marchera à priori pas avec un fichier comportant un saut de ligne dans le nom, mais pour le reste, ça devrait être bon) :
Code :
1
2
3
4
5
6
FILTER=". -name \"*.txt\""
 
echo $FILTER | xargs find | while read N
do
basename "$N"
done
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h14.


 
 
 
 
Partenaires

Hébergement Web