Chercher un fichier avec find [Résolu/Fermé]

Messages postés
161
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
- - Dernière réponse : jipicy
Messages postés
43477
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
17 mars 2018
- 31 août 2010 à 15:28
Bonjour,

Admettons que je sois dans le répertoire racine et que je cherche la liste de tous les fichiers dont le nom commence par toto et qui ne sont pas dans l'arborescence /mnt. Je sais qu'il faut utiliser la commande find et l'option -prune mais impossible d'obtenir le résultat souhaité (suivant les cas je n'obtiens rien ou alors j'obtiens des centaines de fichiers et ça défile sans s'arrêt). quelqu'un peut-il me donner la ligne de commande ? Merci,


Calaz
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
365
6
Merci
Salut,
find / -path '/mnt' -prune -o -name toto* -print
devrait te donner ce que tu veut :)
++

Dire « Merci » 6

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 58268 internautes nous ont dit merci ce mois-ci

np34
Messages postés
21
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
9 novembre 2005
5 -
ok, manque juste des ' autour de toto*, soit :
find / -path '/mnt' -prune -o -name 'toto*' -print

sinon le shell bash risque d'interférer avec la commande find dans l'interprétation de toto*
Messages postés
21510
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
8 octobre 2012
3351
2
Merci
Salut,

essaie avec ça

find / -name 'toto*' | egrep -vi '^(\/mnt)'


cherche dans / tous les fichers qui commence par toto et ensuite n'affiche pas
les fichiers de l'arborescence /mnt

Normalement de l'option i tu n'as pas besoin (c'est pour insensibilité à la case)
J'ai pris l'habitude de l'utilisé
Messages postés
161
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
9
2
Merci
Oui, mes excuses, je n'étais pas dans le répertoire racine. Donc, tu as raison ça marche maintenant il me reste à comprendre.

Merci beaucoup,

Calaz
Messages postés
161
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
9
1
Merci
OK merci lami20j, ta commande marche. Elle est cependant plus longue a execution que l'autre commande proposée ce qui est normal puisque si j'ai bien compris, le répertoire /mnt est visité mais les résultat ne sont pas affichés. Je vais regarder en détail sa syntaxe quand j'aurai étudié les expressions régulières.

Calaz
Messages postés
161
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
9
1
Merci
Concernant les expressions régulières, c'est quelque chose que je vais étudier dans le plus grand détail, j'ai déjà utilisé ce type d'outils sous Windows avec Agent Ransack mais ça restait très superficiel.

Pour l'instant, je me concentre sur find dont j'ai lu attentivement la page man mais qui continue à me rester obscure. D'après ce que j'ai testé, la commande

find / -path '/mnt' -prune -o -name 'toto*' -print

est en fait un raccourci pour

find / \( -path '/mnt' -prune \) -o \( -name toto* -a -print \)

où le -o signifie ou. Je connais bien la valeur logique du OU (qui est true dès qu'une des assertions est true) mais il n'empêche que la commande ci-dessus me reste mystérieuse en particulier je ne vois plus exactement ce que signifie la première assertion -path '/mnt' -prune qui d'ailleurs ne donne pas le même résultat si on la change en -path '/mnt' -a -prune. Si quelqu'un pouvait apporter un petit complément ça pourrait me débloquer même si apparemment je ne suis pas le premier à avoir du mal avec la syntaxe de find.


Calaz
asevere
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
365 -
Pour l'option -prune, elle dis juste de ne pas déscendre dans le repertoire courant

Donc dans ta commande, tu vas chercher deux choses en quelques sorte soit le chemin '/mnt' que tu ne vas pas emprunter, soit des fichiers qui s'appellent 'toto*' dont tu vas afficher les noms :)
1
Merci
bonjour

est-il possible avec la commande find et printf , d'afficher le type de fichier ? (rep ou fichier)

merci d'avance
Messages postés
43477
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
17 mars 2018
4540
1
Merci
Salut,

Ben t'as l'option "-type" de find qui te permet de choisir ou les répertoires ou les fichiers (voir man find pour les autres choix), sinon tu peux passer par un truc du genre :
find  -exec stat -c "%n : %F" {} \;
;-))
Messages postés
161
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
9
0
Merci
Hélas, ça ne marche pas, le message d'erreur étant :

find: les chemins doivent précéder l'expression
Usage: find [CHEMIN] [EXPRESSION]


Calaz
asevere
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
365 -
Bizar
Tu as bien taper la commande donnée?

c'est bien -path '/mnt' -prune ?
np34
Messages postés
21
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
9 novembre 2005
5 -
cf message n°8, l'erreur est à cause des quotes ' qui manquent autour de toto*
Messages postés
21510
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
8 octobre 2012
3351
0
Merci
C'est vrai que la commande find est assez puissante .

Cependant si on combine find avec d'autres utilitaires (grep, egrep, perl) on peut peaufiner nos recherche grâce aux Expressions Régulières (Regular Expressions).

Par example le nom de fichier toto ou Toto ou toTo on peut le chercher avec :

find / | egrep -i '\/(to){2}'

ou si tu ne veux pas trouver toto ....

find / | egrep -vi '\/(to){2}'

Mais l'incovenient c'est que les 2 commandes peuvent trouver aussi totori

pas grave si tu écrit

find / egrep -vi '\/(to){2}\.' si le fichier a une extension

ou

find / egrep -vi '\/(to){2}\>' si le fichier n'a pas une extension

A toi de voir si tu veux ou pas apprendre les RE.
Tu n'as qu'à gagner du temps et de la simplicité.

Bonne journée.
asevere
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
365 -
ceci dit, find à juste ce qu'il faut de joker pour réaliser la plutpart des recherhes 'utiles'.
et rajouter un grep a chaque find que tu fais, dans ta console et dans tes script peut te prendre un temps incalculable surtout utilisé comme dans le premier exemple -i '^\/mnt'.

Je suis pas persuadé qu'il y ai une seule recherche ou il soit vraiment nécéssaire d'utiliser grep...

++
0
Merci
trop fort jp merci ça roule
je connaissais pas la commande stat (honte à moi)

@+
Messages postés
21510
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
8 octobre 2012
3351
-1
Merci
"rajouter un grep a chaque find" - avec egrep j'ai écrit 36 caractères et avec find 41 (à toi de voir)

Tu as raison asevere concernat grep, en revanche avec Perl le temps c'est incalculable mais tu sais pourquoi?

Je te donne un coup de main.

Il est si petit que tu ne peux pas le calculer.

Et concernant '^\/mnt' tu as aussi raison parce qu'en fait ce n'est pas une RE plutôt une chaîne des caractères, c'était seulement une pauvre soulution vu que le demandeur n'arrivais pas s'en sortir avec find.

Mais je ne te ferai pas un cours de RE.

Bonne journée
asevere
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
365 -
Ok:
"rajouter un grep à chaque find" - avec egrep j'ai écrit 36 caractères et avec find 41 (à toi de voir)

Je ne suis absolument pas certain que gagner du temps consiste a taper moins de caracteres.
Mais soyons fou!

Voici un jeu d'essai:
[root@XP1800 root]# cat time_test
#!/bin/sh
time ./time_test_1
time ./time_test_2
time ./time_test_3
time ./time_test_4

[root@XP1800 root]# cat time_test_1
#!/bin/sh
find / -path '/mnt' -prune -o -iname '*toto*' -print

[root@XP1800 root]# cat time_test_2
#!/bin/sh
find / -iname '*toto*' | egrep -vi '^(\/mnt)'

[root@XP1800 root]# cat time_test_3
#!/bin/sh
find / -iname '*toto*'

[root@XP1800 root]# cat time_test_4
#!/bin/sh
find / | egrep -i '.*toto.*'


Voici le resultat...
[root@XP1800 root]# ./time_test
/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.26user 0.57system 0:25.58elapsed 3%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+572minor)pagefaults 0swaps

/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.28user 3.07system 0:45.65elapsed 7%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (1major+1164minor)pagefaults 0swaps

/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.27user 1.94system 0:38.99elapsed 5%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+573minor)pagefaults 0swaps

/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.25user 2.98system 0:39.13elapsed 8%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (3major+1164minor)pagefaults 0swaps


Et encore, find utilise un cache qui joue sont role pour les test 3 et 4:
[root@XP1800 root]# cat time_test
#!/bin/sh
time ./time_test_2
time ./time_test_1
time ./time_test_4
time ./time_test_3


[root@XP1800 root]# ./time_test
/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.30user 1.98system 0:35.19elapsed 6%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1167minor)pagefaults 0swaps

/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.29user 0.63system 0:26.04elapsed 3%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+572minor)pagefaults 0swaps

/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.25user 3.13system 0:42.08elapsed 8%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1167minor)pagefaults 0swaps

/usr/share/apps/ksgmltools2/docbook/xsl/html/autotoc.xsl
/usr/share/apps/ksgmltools2/docbook/xsl/params/autotoc.label.separator.xml
/usr/share/sgml/docbook/yelp/docbook/html/autotoc.xsl
0.27user 1.90system 0:32.65elapsed 6%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+573minor)pagefaults 0swaps


Pour moi ça parle tout seul.

Mais je t'en prie, fait moi un cours sur les expressions réguliéres!
Je n'ai rien contre les expressions régulieres, mais jsute sur la facon de les utiliser.... :)
lami20j
Messages postés
21510
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
8 octobre 2012
3351 > asevere
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
-
Salut asevere,

Et tu as perdu ce temps pour me montrer que tu'as raison quand je t'ai donné raison???????????????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Donc tu n'as rien compris. Si je te dit dans ma langue d'origine tu ne comprendras pas non plus.

Sur tous les plans je t'ai donné raison. Bien sur que c'est plus rapide avec find.

Et en plus j'ai dit que '^\/mnt' ce n'est pas une expression régulière.

Donc ou t'es têtu et tu veut montrer que t'as raison (je t'ai donné déjà raison) ou tu ne comprends pas trés bien ta langue. De toute façon comme ca tu n'arrive nul part.

Et concernant le cours sur les Expressions Régulières je te recommande le livre Maîtrise des Expressions Régulières ed. O'Reilly

Je croyais que les utilisateurs Linux sont plus ouverts, tu n'en fait pas
parti pour l'instant.

Bonne chance

P.S. Tu as fait aussi une affirmation concernant mv. Regarde ma réponse si
tu ne l'as pas vu encore :

Salut,

Je n'ai rien contre toi mai j'ai l'impression que tu veux imposer ton goût.

Je respecte tes opinions mais tu as écrit ca et ce n'est pas vrai.
"je rajouterai juste que mv (move) est fait, comme son nom l'indique, pour déplacer des fichiers et non les renomer :) "

Tape dans ta console man mv et tu verras :

MV(1) Manuel de l'utilisateur Linux MV(1)

NOM
mv - Déplacer ou renommer des fichiers.

@+

P.S. En général on repond aux questions, mais on ne fait pas la morale.
On est ici pour partager nos connaissances, après chaqu'un son choix.
asevere
Messages postés
13090
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
19 août 2019
365 -
Trés bien,

Alors je vais te dire ou je voulais en venir.

"rajouter un grep a chaque find" - avec egrep j'ai écrit 36 caractères et avec find 41 (à toi de voir)
J'ai vu j'ai répondu.

Je vais même te faire l'affront de te dire que:
- find / -iname '*toto*' totalise 22 caractéres
- find / | egrep -i '.*toto.*' toalise 28 caractéres

Tu as raison asevere concernat grep, en revanche avec Perl le temps c'est incalculable [...]
Je vois pas ou te veut en venir, on m'aurait caché que perl est capable de remonter le temps !? :D
Hé oui...
find / -path '/mnt' -prune -o -iname '*toto*' -print et plus rapide a executer que find / -iname '*toto*' tout comme find / -iname '*toto*' l'est plus que find / donc perl, grep, ou n'importe quoi d'autre n'est pas capable d'arranger ça.

Mais la raison réel qui m'a fait te répondre, c'est que:
Tu as raison asevere concernat grep, en revanche avec Perl le temps c'est incalculable mais tu sais pourquoi?
Je te donne un coup de main.
Il est si petit que tu ne peux pas le calculer.
[...]
Mais je ne te ferai pas un cours de RE.


Tu te prends pour une référence ?
Qu'est ce qui te fait penser que tu es capable de donner un cours d'expression réguliere a quiconque ici ?

Et concernant '^\/mnt' tu as aussi raison parce qu'en fait ce n'est pas une RE plutôt une chaîne des caractères, c'était seulement une pauvre soulution vu que le demandeur n'arrivais pas s'en sortir avec find.

ça je suis contre, les commande linux sont des outils tous aussi puissants les uns que les autres, et je trouve vraiment dommage de ne pas profiter au maximum de toute les possibilitées offertes par chaque options qu'elles proposent.
Et je ne dirai jamais a quelqu'un qui a un tournevis mais que ne sais pas qu'il faut le faire tourner pour visser d'aller acheter une visseuse electrique.
-1
Merci
Bonjour, je cherche à afficher tous les fichiers d'un répertoire qui contiennent une expression.

En clair, en raison d'un changement de nom de domaine, je cherche toutes les occurrences de l'ancienne adresse dans tous les fichiers des répertoires du site pour en faire le changement.

Idéalement le remplacement automatique serait carrément le rayon de soleil de ma journée ! lol

Pouvez-vous m'aider ? Merci beaucoup !
jipicy
Messages postés
43477
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
17 mars 2018
4540 -
Salut,

find /chemin -type f -name "*" -exec grep -Hn "Expression recherchée" {} \;

Devrait déjà te donner la liste des fichiers et les numéros de ligne...
jipicy
Messages postés
43477
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
17 mars 2018
4540 -
Et :

find /chemin -type f -name "*" -exec sed -i.bak 's/Expression recherchée/Expression de substitution/' {} \;

Devrait faire le remplacement tout en faisant une copie de sauvegarde de l'ancien fichier...