Chercher un fichier avec find

Résolu/Fermé
calaceite Messages postés 159 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 23 avril 2007 - 12 mars 2005 à 14:27
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 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
A voir également:

12 réponses

asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
12 mars 2005 à 15:09
Salut,
find / -path '/mnt' -prune -o -name toto* -print
devrait te donner ce que tu veut :)
++
6
np34 Messages postés 21 Date d'inscription samedi 12 mars 2005 Statut Membre Dernière intervention 9 novembre 2005 5
12 mars 2005 à 17:09
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*
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 mars 2005 à 15:49
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é
2
calaceite Messages postés 159 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 23 avril 2007 10
12 mars 2005 à 16:22
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
2
calaceite Messages postés 159 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 23 avril 2007 10
12 mars 2005 à 16:36
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
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
calaceite Messages postés 159 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 23 avril 2007 10
12 mars 2005 à 18:14
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
1
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
12 mars 2005 à 19:46
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 :)
0
bonjour

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

merci d'avance
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
27 août 2007 à 12:26
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" {} \;
;-))
1
calaceite Messages postés 159 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 23 avril 2007 10
12 mars 2005 à 15:27
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
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
12 mars 2005 à 15:48
Bizar
Tu as bien taper la commande donnée?

c'est bien -path '/mnt' -prune ?
0
np34 Messages postés 21 Date d'inscription samedi 12 mars 2005 Statut Membre Dernière intervention 9 novembre 2005 5
12 mars 2005 à 17:56
cf message n°8, l'erreur est à cause des quotes ' qui manquent autour de toto*
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 mars 2005 à 17:05
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.
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
12 mars 2005 à 17:19
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
trop fort jp merci ça roule
je connaissais pas la commande stat (honte à moi)

@+
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 mars 2005 à 17:34
"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
-1
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
12 mars 2005 à 18:27
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.... :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
12 mars 2005 à 18:40
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.
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
12 mars 2005 à 19:04
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.
0
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 !
-1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
31 août 2010 à 14:24
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...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
Modifié par jipicy le 31/08/2010 à 15:29
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...
0