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 →
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:systeme:find [09/12/2012 03:10] martin_mtl créée |
doc:systeme:find [26/08/2013 15:45] smolski |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Find ====== | ====== Find ====== | ||
- | Cette commande permet de faire des recherches de fichier ou de dossier sous GNU/Linux "en mode console". | + | En cours de réécriture **smolski** 26/08/2013 |
+ | |||
+ | Les exemples de ce tuto sont tous à faire en [[commande:su|user]] sauf spécification précise pour certains. | ||
+ | |||
+ | 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 ===== | ||
- | ''-atime +n (ou -n)'' # trouve les fichiers auxquels on a accédé il y a plus de n jours (ou moins de n jours) | + | ^ Options ^ Fonctions ^ |
- | + | |-atime +n (ou -n) |//trouve les fichiers auxquels on a accédé il y a plus de n jours (ou moins de n jours)// | | |
- | ''-mtime +n (ou -n)'' # trouve les fichiers modifiés il y a plus de n jours (ou moins de n jours) | + | |-mtime +n (ou -n) |//trouve les fichiers modifiés il y a plus de n jours (ou moins de n jours) | |
- | + | |-maxdepth n |définit le niveau maximum de sous-répertoire à explorer// | | |
- | ''-maxdepth n'' # définit le niveau maximum de sous-répertoire à explorer | + | |-type l ou d ou f |//indique le type de fichier à rechercher (l pour lien symbolique, d pour répertoire (directory), f pour fichier)// | |
- | + | |-name |//recherche par motif en respectant la casse// | | |
- | ''-type l ou d ou f'' # indique le type de fichier à rechercher (l pour lien symbolique, d pour répertoire, f pour fichier) | + | |-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 37: | Ligne 43: | ||
- "''-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 47: | Ligne 52: | ||
Prenons un autre exemple. | Prenons un autre exemple. | ||
- | 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 55: | Ligne 60: | ||
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, je me mets 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 | ||
- option : -type | - option : -type | ||
- argument : "d" (comme "directory") | - argument : "d" (comme "directory") | ||
- | indiquent que l'on cherche un répertoire) du nom de '''archives''' à partir du répertoire /media/homebis. | + | indiquant que l'on cherche un répertoire du nom de //archives// à partir du répertoire /media/homebis. |
La réponse : | La réponse : | ||
Ligne 71: | Ligne 76: | ||
/media/homebis/Documents_gr/archives | /media/homebis/Documents_gr/archives | ||
/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 | ||
+ | |||
+ | Il existe plus d'une façon d'y arriver. \\ | ||
+ | Voyons comment on peut s'y prendre. | ||
+ | |||
+ | ==== Première façon : ==== | ||
+ | |||
+ | <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/... | ||
+ | |||
+ | ==== Deuxième façon : ==== | ||
+ | |||
+ | Une autre manière d'écrire la commande ci-dessus est la suivante : | ||
+ | <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> | ||
===== Filtrer en fonction des droits ===== | ===== Filtrer en fonction des droits ===== | ||
Ligne 79: | Ligne 109: | ||
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 96: | Ligne 127: | ||
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 123: | Ligne 155: | ||
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 136: | Ligne 168: | ||
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 144: | Ligne 177: | ||
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 152: | Ligne 185: | ||
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 160: | Ligne 194: | ||
==== 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 171: | Ligne 205: | ||
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 277: | Ligne 311: | ||
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 288: | Ligne 321: | ||
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 415: | Ligne 447: | ||
<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 430: | Ligne 463: | ||
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 444: | Ligne 478: | ||
<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 455: | Ligne 490: | ||
<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 472: | Ligne 508: | ||
<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 479: | Ligne 514: | ||
<code bash> | <code bash> | ||
- | ~/tmp/df_tp01$ find . -depth -type d -name ploum | + | find . -depth -type d -name ploum |
</code> | </code> | ||
Ligne 501: | Ligne 536: | ||
//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 511: | Ligne 552: | ||
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> |