logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
doc:systeme:find [31/07/2013 21:50]
127.0.0.1 modification externe
doc:systeme:find [20/09/2013 13:11]
Marie-Lou Ajout recherche fichiers n'appartenant pas à l'utilisateur
Ligne 1: Ligne 1:
-//Page en cours de modification : 08 déc 12// 
- 
 ====== Find ====== ====== Find ======
 +
 +(//testé// - **smolski** 26/08/2013) Le retour sur le forum est ici : [[http://​debian-facile.org/​viewtopic.php?​id=7310 | Lien vers le forum concernant ce tuto]]
 +>​N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !
 +
 +  * Objet : find
 +  * Niveau requis : DÉBUTANT
 +  * Tags :
 +  * Commentaires : //recherche de fichiers. //
 +  * Débutant, à savoir : [[manuel:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
 +
 +
 +Les exemples de ce tuto sont tous à faire en //user// sauf spécification.
  
 Cette commande permet de faire des recherches de fichier ou de dossier dans une hiérarchie de répertoires. Cette commande permet de faire des recherches de fichier ou de dossier dans une hiérarchie de répertoires.
  
 Par exemple, je voudrais chercher le log messages, mais je sais pas où se trouve ce fichier, faites : Par exemple, je voudrais chercher le log messages, mais je sais pas où se trouve ce fichier, faites :
 +<code bash>
 +find / -name '​messages'</​code>​
  
-    portable:/​home/​mattux # find / -name '​messages'​ +<​code>​ 
-    /​var/​log/​messages +/​var/​log/​messages</code>
-    portable:/​home/mattux #+
  
-Voilà la réponse : +Voilà la réponse : \\ 
-   il se trouve dans le répertoire /var/log.+Il se trouve dans le répertoire ​''​/var/log''​.
  
 == Nota == == Nota ==
  
-Notez l'​utilisation des apostrophes __afin d'​éviter que l'​interpréteur de commande n'​étende le motif__. Elles sont inutiles dans ce cas-ci mais c'est une bonne pratique de toujours les utiliser afin d'​éviter l'​extension //motif//.+Notez l'​utilisation des apostrophes __afin d'​éviter que l'​interpréteur de commande n'​étende le motif__. ​\\ 
 +Elles sont inutiles dans ce cas-ci mais c'est une bonne pratique de toujours les utiliser afin d'​éviter l'​extension //motif//.
  
 ===== Quelques options ===== ===== Quelques options =====
Ligne 27: Ligne 39:
 |-name ​ |//​recherche par motif en respectant la casse// ​ | |-name ​ |//​recherche par motif en respectant la casse// ​ |
 |-iname ​ |//​recherche par motif sans respecter la casse// ​ | |-iname ​ |//​recherche par motif sans respecter la casse// ​ |
 +
 ===== Recherche simple par nom ===== ===== Recherche simple par nom =====
  
 Exemple simple : comment trouver un fichier portant le nom ''​note''​ ? Exemple simple : comment trouver un fichier portant le nom ''​note''​ ?
- +<code bash> 
-  ​$ ​find / -name '​note'​+find / -name '​note'​</​code>​
  
 Décomposition de la commande de l'​exemple : Décomposition de la commande de l'​exemple :
Ligne 38: Ligne 51:
   - "''​-name''​ " est l'​option qui indique ici que nous voulons spécifier le nom d'un fichier.   - "''​-name''​ " est l'​option qui indique ici que nous voulons spécifier le nom d'un fichier.
  
-Après un long délai d'​attente,​ la recherche se faisant dans toute l'​arborescence de la partition, la réponse fini par venir +Après un long délai d'​attente,​ la recherche se faisant dans toute l'​arborescence de la partition, la réponse fini par venir :
    /​home/​martin/​note    /​home/​martin/​note
  
Ligne 49: Ligne 61:
  
 Pour chercher tous les fichiers commençant par //note// et définir à partir de quel répertoire on souhaite effectuer la recherche on utilise cette syntaxe : Pour chercher tous les fichiers commençant par //note// et définir à partir de quel répertoire on souhaite effectuer la recherche on utilise cette syntaxe :
- +<code bash> 
-  $find /​home/​martin -name '​note*'​+find /​home/​martin -name '​note*'​</​code>​
  
 ===== Recherche par nom simple & multiple ===== ===== Recherche par nom simple & multiple =====
Ligne 56: Ligne 68:
 Maintenant, regardons, encore une fois à l'aide d'un exemple, la syntaxe de la commande **find** si l'on recherche plutôt un ou plusieurs répertoires. Maintenant, regardons, encore une fois à l'aide d'un exemple, la syntaxe de la commande **find** si l'on recherche plutôt un ou plusieurs répertoires.
  
-Je cherche à trouver les répertoires archives dans /​media/​homebis +Je cherche à trouver les répertoires archives dans /​media/​homebis. 
-  # find /​media/​homebis -type d -name '​archives'​ +Première chose à noter, il peut-être nécessaire de se mettre en [[commande:​su|root]] pour avoir accès à tous les répertoires. 
- +<code bash> 
-Première chose à noter, il peut être nécessaire de se mettre en root pour avoir accès à tous les répertoires.+find /​media/​homebis -type d -name '​archives'</​code>​
  
 Dans ce cas-ci, je demande donc à **find** de trouver les répertoires Dans ce cas-ci, je demande donc à **find** de trouver les répertoires
Ligne 73: Ligne 85:
   /​media/​homebis/​Documents_gr/​mes_fichiers/​archives   /​media/​homebis/​Documents_gr/​mes_fichiers/​archives
  
-Autre exemple un peu plus complexe cette fois. Je désire faire une recherche de tous les fichiers audio de type .mp3 et .ogg+Autre exemple un peu plus complexe cette fois. \\ 
 +Je désire faire une recherche de tous les fichiers audio de type .mp3 et .ogg
  
-Il existe plus d'une façon d'y arriver. Voyons comment on peut s'y prendre.+Il existe plus d'une façon d'y arriver. ​\\ 
 +Voyons comment on peut s'y prendre.
  
-Première façon : +==== Première façon : ====
-  find /​home/​martin/ ​ \( -name '​*.mp3'​ -o -name '​*.ogg'​ \)+
  
-On peut noter l'utilisation du -o qui correspond à l'opérateur ou ("​or"​ en anglais)+<code bash> 
 +find /​home/​martin/ ​ \( -name '*.mp3' -o -name '*.ogg' \)</​code>​
  
 +<​note>​On peut noter l'​utilisation du -o qui correspond à l'​opérateur ou ("​or"​ en anglais)</​note>​
 Cela me donnera toute une liste de fichiers /​home/​martin/​... Cela me donnera toute une liste de fichiers /​home/​martin/​...
  
-Deuxième façon :+==== Deuxième façon : ==== 
 Une autre manière d'​écrire la commande ci-dessus est la suivante : Une autre manière d'​écrire la commande ci-dessus est la suivante :
-  ​find -type f -name "​*.mp3"​ -o -name "​*.ogg"​+<code bash> 
 +find -type f -name "​*.mp3"​ -o -name "​*.ogg"​</​code>​ 
 + 
 +Si je tape cette commande en étant dans mon répertoire /​home/​martin,​ le résultat sera une liste de fichiers ./.... \\ 
 +Il est intéressant de savoir que l'on peut étendre la recherche aux fichiers mp3 et mp4 en remplaçant le 3 par un ?((Voir : [[manuel:​regexp]])). La commande deviendrait donc : 
 +<code bash> 
 +find -type f -name "​*.mp?"​ -o -name "​*.ogg"</​code>​ 
 + 
 +===== Rechercher pour supprimer ===== 
 + 
 + 
 +Un fonction intéressante de //find// est de supprimer en lot les fichiers trouvés. 
 + 
 +Il n'est point rare de télécharger ou d'​installer de nombreux fichiers qui ne nous servent plus, mais devant le travail pénible de devoir supprimer tous ces fichiers, on repousse au lendemain cette charge. Heureusement grâce à la fonction -delete de find, c'est un pur bonheur. 
 + 
 +==== Paramètre -delete ====
  
-Si je tape cette commande en étant ​dans mon répertoire /home/martin, le résultat sera une liste de fichiers ​./....+Exemple, si dans votre home ou autre dossier vous avez beaucoup ​de fichier ​.tar.gz qui ne vous servent plus à rienIl suffit de lancer la commande suivante : 
 +<code bash>​find -iname "*.tar.gz" -delete</​code>​
  
-Il est intéressant de savoir que l'on peut étendre ​la recherche aux fichiers mp3 et mp4 en remplaçant le 3 par un ?La commande deviendrait donc +<note important>​**Attention, ​la fonction -delete ne vous demande pas de confirmation**</​note>​ 
-  find -type f -name "*.mp?" --name "*.ogg"+=== Supprimer avec demande de confirmation === 
 +Pour une demande de confirmation avant suppression de chaque fichier ".tar.gz"​ trouvés ​
 +<code bash>find -iname "*.tar.gz" -ok rm {} \;</​code>​ 
 +Merci à [[http://​debian-facile.org/​viewtopic.php?​pid=67484#​p67484|MicP]] pour cette trouvaille :)
  
 + --- //​[[|david96]] 12/09/2013 21:15//
 ===== Filtrer en fonction des droits ===== ===== Filtrer en fonction des droits =====
  
Ligne 100: Ligne 136:
 Voici par exemple comment obtenir la liste de tout les fichiers dans le repertoire ''/​bin''​ qui ont le ''​bit setuid valant 1''​ : Voici par exemple comment obtenir la liste de tout les fichiers dans le repertoire ''/​bin''​ qui ont le ''​bit setuid valant 1''​ :
  
 +<code bash>
 +find /bin -perm /5000 -user root<​code>​
 <​code>​ <​code>​
-$ find /bin -perm /5000 -user root 
 /bin/su /bin/su
 /bin/mount /bin/mount
Ligne 117: Ligne 154:
 Voici par exemple la recherche de tous les fichiers terminant par ''​.java''​ dans le dossier courant: Voici par exemple la recherche de tous les fichiers terminant par ''​.java''​ dans le dossier courant:
  
 +<code bash>
 +find . -name '​*.java'<​code>​
 <​code>​ <​code>​
-$ find . -name '​*.java'​ 
 ./​java/​jdk1.5.0_06/​demo/​applets/​Animator/​Animator.java ./​java/​jdk1.5.0_06/​demo/​applets/​Animator/​Animator.java
 ./​java/​jdk1.5.0_06/​demo/​applets/​ArcTest/​ArcTest.java ./​java/​jdk1.5.0_06/​demo/​applets/​ArcTest/​ArcTest.java
Ligne 127: Ligne 165:
 </​code>​ </​code>​
  
 +===== Rechercher les fichiers n'​appartenant pas à l'​utilisateur =====
 +
 +Il peut parfois être utile de rechercher les fichiers n'​appartenant pas à l'​utilisateur,​ en vue de corriger un problème rencontré avec une application (par exemple, un fichier peut appartenir à root au lieu d'​appartenir à l'​utilisateur ; ce dernier risque de ne pas avoir de droits dessus, ce que peut alors provoquer une erreur dans une application cherchant à modifier le dit fichier).
 +
 +Pour ce faire, il suffit d'​exécuter là commande suivante, où « utilisateur » est à remplacer par votre nom d'​utilisateur :
 +
 +<code bash>
 +find /​home/​utilisateur ! -user utilisateur
 +</​code>​
 +
 +ou bien, en utilisant des variables :
 +
 +<code bash>
 +find $HOME ! -user $USER
 +</​code>​
 +
 +Pour avoir davantage d'​informations sur les fichiers ainsi trouvés, vous pouvez ajouter l'​option ''​ls''​ :
 +
 +<code bash>
 +find $HOME ! -user $USER -ls
 +</​code>​
 ===== -exec - Exécuter une commande ===== ===== -exec - Exécuter une commande =====
  
Ligne 144: Ligne 203:
  
 Par exemple ainsi : Par exemple ainsi :
- +<code bash> 
-   $ find /​home/​mon_user/​test/​ -type f -exec echo {} \++find /​home/​mon_user/​test/​ -type f -exec echo {} \+</​code>​
  
 <note warning> <note warning>
Ligne 157: Ligne 216:
  
 Voici par exemple comment on peut compter le nombre de lignes de chaque fichier de code Python de ce site: Voici par exemple comment on peut compter le nombre de lignes de chaque fichier de code Python de ce site:
- +<code bash> 
-   find developpement/​django/​certif -name '​*.py'​ -exec wc -l {} \;+   find developpement/​django/​certif -name '​*.py'​ -exec wc -l {} \;</​code>​ 
 +<​code>​
        1 developpement/​django/​certif/​__init__.py        1 developpement/​django/​certif/​__init__.py
        0 developpement/​django/​certif/​acronym/​__init__.py        0 developpement/​django/​certif/​acronym/​__init__.py
Ligne 165: Ligne 225:
       13 developpement/​django/​certif/​acronym/​urls.py       13 developpement/​django/​certif/​acronym/​urls.py
       42 developpement/​django/​certif/​acronym/​views.py       42 developpement/​django/​certif/​acronym/​views.py
-      .../...+      .../...</​code>​
  
   - Ici la commande **find** est utilisée avec l'​option ''​-name''​ pour ne sélectionner que les fichiers se terminant par "''​.py''"​ (extension de Python).   - Ici la commande **find** est utilisée avec l'​option ''​-name''​ pour ne sélectionner que les fichiers se terminant par "''​.py''"​ (extension de Python).
Ligne 173: Ligne 233:
  
 Comme d'​habitude vous avez aussi le : Comme d'​habitude vous avez aussi le :
-   ​$ ​man find+<code bash> 
 +man find</​code>​
  
 //​Entièrement disponible à votre curiosité !// ;-) //​Entièrement disponible à votre curiosité !// ;-)
Ligne 181: Ligne 242:
 ==== Préparation du terrain ==== ==== Préparation du terrain ====
  
-Placez-vous dans un nouveau dossier créé pour l'​occasion. Exemple :+Placez-vous dans un nouveau dossier créé pour l'​occasion. ​\\ 
 +Exemple :
 <code bash> <code bash>
-cd +cd 
-~$ mkdir -p tmp/​df_tp01/​ +mkdir -p ~/tmp/​df_tp01/​ 
-~$ cd tmp/​df_tp01/​ +cd ~/​tmp/​df_tp01/
-~/​tmp/​df_tp01$+
 </​code>​ </​code>​
  
Ligne 192: Ligne 253:
 suite ainsi : suite ainsi :
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​for i in $(seq 5); do mkdir toctoc$i; done +for i in $(seq 5); do mkdir toctoc$i; done 
-~/​tmp/​df_tp01$ ​mkdir -p toctoc1/paf toctoc2/paf toctoc3/​pif/​paf toctoc4/​paf/​paf +mkdir -p toctoc1/paf toctoc2/paf toctoc3/​pif/​paf toctoc4/​paf/​paf 
-~/​tmp/​df_tp01$ ​touch toctoc5/​paf +touch toctoc5/​paf 
-~/​tmp/​df_tp01$ ​for i in $(seq 4); do for j in toctoc*; do mkdir -p $j/​tchac$RANDOM;​ done; done+for i in $(seq 4); do for j in toctoc*; do mkdir -p $j/​tchac$RANDOM;​ done; done
 </​code>​ </​code>​
  
Ligne 298: Ligne 359:
 Placez-vous dans un nouveau dossier créé pour l'​occasion. Exemple : Placez-vous dans un nouveau dossier créé pour l'​occasion. Exemple :
 <code bash> <code bash>
-cd +cd 
-~$ mkdir -p tmp/​df_tp01/​ +mkdir -p tmp/​df_tp01/​ 
-~$ cd tmp/​df_tp01/​ +cd tmp/​df_tp01/​
-~/​tmp/​df_tp01$+
 </​code>​ </​code>​
  
Ligne 309: Ligne 369:
 Voici pour la première partie : Voici pour la première partie :
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​touch phaute_dorthografe +touch phaute_dorthografe 
-~/​tmp/​df_tp01$ ​touch notes_temporaires+touch notes_temporaires
 ~/​tmp/​df_tp01$ touch quisuisje ~/​tmp/​df_tp01$ touch quisuisje
-~/​tmp/​df_tp01$ 
 </​code>​ </​code>​
  
Ligne 436: Ligne 495:
  
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find .+find .
 </​code>​ </​code>​
  
 On va se concentrer sur les répertoires ''​paf''​ : On va se concentrer sur les répertoires ''​paf''​ :
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find . -type d -name paf+find . -type d -name paf</​code>​ 
 +<​code>​
 ./​toctoc3/​pif/​paf ./​toctoc3/​pif/​paf
 ./​toctoc1/​paf ./​toctoc1/​paf
Ligne 451: Ligne 511:
 Pour afficher les sous-dossiers en premier, on ajoute l'​option ''​-depth''​ **au début** de la commande Pour afficher les sous-dossiers en premier, on ajoute l'​option ''​-depth''​ **au début** de la commande
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find . -depth -type d -name paf+find . -depth -type d -name paf</​code>​ 
 +<​code>​
 ./​toctoc3/​pif/​paf ./​toctoc3/​pif/​paf
 ./​toctoc1/​paf ./​toctoc1/​paf
Ligne 465: Ligne 526:
  
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find . -depth -type d -name paf -exec pwd \;+find . -depth -type d -name paf -exec pwd \;</​code>​ 
 +<​code>​
 /​home/​captnfab/​tmp/​df_tp01 /​home/​captnfab/​tmp/​df_tp01
 /​home/​captnfab/​tmp/​df_tp01 /​home/​captnfab/​tmp/​df_tp01
Ligne 476: Ligne 538:
  
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find . -depth -type d -name paf -execdir pwd \;+find . -depth -type d -name paf -execdir pwd \;</​code>​ 
 +<​code>​
 /​home/​captnfab/​tmp/​df_tp01/​toctoc3/​pif /​home/​captnfab/​tmp/​df_tp01/​toctoc3/​pif
 /​home/​captnfab/​tmp/​df_tp01/​toctoc1 /​home/​captnfab/​tmp/​df_tp01/​toctoc1
Ligne 493: Ligne 556:
  
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find . -depth -type d -name paf -execdir mv paf ploum  \; +find . -depth -type d -name paf -execdir mv paf ploum  \;
 </​code>​ </​code>​
  
Ligne 500: Ligne 562:
  
 <code bash> <code bash>
-~/​tmp/​df_tp01$ ​find . -depth -type d -name ploum+find . -depth -type d -name ploum
 </​code>​ </​code>​
  
Ligne 522: Ligne 584:
 //Merci à //​**adrien**//​ sur le chan //#​slackware-fr//​ et au //​**captnfab**//​ not' matelot hottentot favori !// :-) //Merci à //​**adrien**//​ sur le chan //#​slackware-fr//​ et au //​**captnfab**//​ not' matelot hottentot favori !// :-)
  
-===== Effacer le contenu d'un fichiers ​=====+==== Effacer le contenu d'un fichiers ====
  
-Pour effacer le contenu d'un fichier :+Pour effacer le contenu d'un fichier 
 + 
 +=== le chevron === 
 + 
 +Avec [[commande:chevron|la commande chevron]]
 <code bash> <code bash>
 find -type f -iname nom_du_fichier -execdir cat {} nom_du_fichier + > nom_du_fichier \;</​code>​ find -type f -iname nom_du_fichier -execdir cat {} nom_du_fichier + > nom_du_fichier \;</​code>​
 +
 +=== xargs ===
  
 Ou bien avec **xargs** : Ou bien avec **xargs** :
Ligne 532: Ligne 600:
 find -type f -iname nom_du_fichier | xargs cat > nom_du_fichier \;</​code>​ find -type f -iname nom_du_fichier | xargs cat > nom_du_fichier \;</​code>​
  
-Ou encore avec la commande ​**cp** :+=== cp === 
 + 
 +Ou encore avec [[commande:​cp|la commande cp]] :
 <code bash> <code bash>
 find -type f -iname nom_du_fichier -exec cp /dev/null {} \;</​code>​ find -type f -iname nom_du_fichier -exec cp /dev/null {} \;</​code>​
doc/systeme/find.txt · Dernière modification: 24/10/2022 18:38 par Jean-Pierre Pinson

Pied de page des forums

Propulsé par FluxBB