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.
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 [20/09/2013 13:11] Marie-Lou Ajout recherche fichiers n'appartenant pas à l'utilisateur |
doc:systeme:find [27/05/2015 17:20] milou [TP01 - exec et execdir] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== 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 | * Objet : find | ||
- | * Niveau requis : DÉBUTANT | + | * Niveau requis : {{tag>débutant avisé}} |
- | * Tags : | + | * Commentaires : //Recherche de fichiers. // |
- | * Commentaires : //recherche de fichiers. // | + | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !]] :-) |
- | * Débutant, à savoir : [[manuel:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | + | * Suivi : {{tag>en-chantier à-tester à-placer}} - FIXME Pour choisir, voir les autres Tags possibles dans [[:atelier:#tags|l'Atelier]]. |
+ | * Création par [[user>smolski]] <date> | ||
+ | * Testé par [[user>smolski]] 26-08-2013 | ||
+ | * Commentaires sur le forum : [[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 !)) | ||
+ | |||
+ | **Nota :** | ||
+ | |||
+ | Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
+ | ===== Introduction ===== | ||
Les exemples de ce tuto sont tous à faire en //user// sauf spécification. | Les exemples de ce tuto sont tous à faire en //user// sauf spécification. | ||
Ligne 16: | Ligne 21: | ||
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> | + | <code user> |
find / -name 'messages'</code> | find / -name 'messages'</code> | ||
- | <code> | + | <file bash résultat de la commande précédente> |
- | /var/log/messages</code> | + | /var/log/messages</file> |
Voilà la réponse : \\ | Voilà la réponse : \\ | ||
Ligne 43: | Ligne 48: | ||
Exemple simple : comment trouver un fichier portant le nom ''note'' ? | Exemple simple : comment trouver un fichier portant le nom ''note'' ? | ||
- | <code bash> | + | <code user> |
find / -name 'note'</code> | find / -name 'note'</code> | ||
Ligne 52: | Ligne 57: | ||
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 | + | <file bash résultat de la commande précédente> |
+ | /home/martin/note</file> | ||
Si l'on n'est pas sûr de la "casse" (Majuscule ou Minuscule) on utilise l'option ''-iname''. | Si l'on n'est pas sûr de la "casse" (Majuscule ou Minuscule) on utilise l'option ''-iname''. | ||
Ligne 61: | Ligne 67: | ||
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> | + | <code user> |
find /home/martin -name 'note*'</code> | find /home/martin -name 'note*'</code> | ||
Ligne 69: | Ligne 75: | ||
Je cherche à trouver les répertoires archives dans /media/homebis. | Je cherche à trouver les répertoires archives dans /media/homebis. | ||
- | Première chose à noter, il peut-être nécessaire de se mettre en [[commande:su|root]] pour avoir accès à tous les répertoires. | + | Première chose à noter, il peut-être nécessaire de se mettre en [[:doc:systeme:su|root]] pour avoir accès à tous les répertoires. |
- | <code bash> | + | <code user> |
find /media/homebis -type d -name 'archives'</code> | find /media/homebis -type d -name 'archives'</code> | ||
Ligne 79: | Ligne 85: | ||
La réponse : | La réponse : | ||
+ | <file bash résultat de la commande précédente> | ||
/media/homebis/martin/textes/mes_archives/Baseball/archives | /media/homebis/martin/textes/mes_archives/Baseball/archives | ||
/media/homebis/martin/archives | /media/homebis/martin/archives | ||
Ligne 84: | Ligne 91: | ||
/media/homebis/Documents_gr/archives | /media/homebis/Documents_gr/archives | ||
/media/homebis/Documents_gr/mes_fichiers/archives | /media/homebis/Documents_gr/mes_fichiers/archives | ||
+ | </file> | ||
Autre exemple un peu plus complexe cette fois. \\ | Autre exemple un peu plus complexe cette fois. \\ | ||
Ligne 93: | Ligne 101: | ||
==== Première façon : ==== | ==== Première façon : ==== | ||
- | <code bash> | + | <code user> |
find /home/martin/ \( -name '*.mp3' -o -name '*.ogg' \)</code> | find /home/martin/ \( -name '*.mp3' -o -name '*.ogg' \)</code> | ||
Ligne 102: | Ligne 110: | ||
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 : | ||
- | <code bash> | + | <code user> |
find -type f -name "*.mp3" -o -name "*.ogg"</code> | 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 ./.... \\ | 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 : | + | 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 : [[:doc:programmation:shell:regexp]])). La commande deviendrait donc : |
- | <code bash> | + | <code user> |
find -type f -name "*.mp?" -o -name "*.ogg"</code> | find -type f -name "*.mp?" -o -name "*.ogg"</code> | ||
===== Rechercher pour supprimer ===== | ===== Rechercher pour supprimer ===== | ||
- | |||
Un fonction intéressante de //find// est de supprimer en lot les fichiers trouvés. | Un fonction intéressante de //find// est de supprimer en lot les fichiers trouvés. | ||
Ligne 120: | Ligne 127: | ||
Exemple, si dans votre home ou autre dossier vous avez beaucoup de fichier .tar.gz qui ne vous servent plus à rien. Il suffit de lancer la commande suivante : | Exemple, si dans votre home ou autre dossier vous avez beaucoup de fichier .tar.gz qui ne vous servent plus à rien. Il suffit de lancer la commande suivante : | ||
- | <code bash>find -iname "*.tar.gz" -delete</code> | + | <code user>find -iname "*.tar.gz" -delete</code> |
<note important>**Attention, la fonction -delete ne vous demande pas de confirmation**</note> | <note important>**Attention, la fonction -delete ne vous demande pas de confirmation**</note> | ||
+ | |||
=== Supprimer avec demande de confirmation === | === Supprimer avec demande de confirmation === | ||
+ | |||
Pour une demande de confirmation avant suppression de chaque fichier ".tar.gz" trouvés : | Pour une demande de confirmation avant suppression de chaque fichier ".tar.gz" trouvés : | ||
- | <code bash>find -iname "*.tar.gz" -ok rm {} \;</code> | + | <code user>find -iname "*.tar.gz" -ok rm {} \;</code> |
Merci à [[http://debian-facile.org/viewtopic.php?pid=67484#p67484|MicP]] pour cette trouvaille :) | 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 ===== | ||
Une option très pratique est ''-perm'' qui permet de sélectionner des fichiers en fonctions de leurs droits. \\ | Une option très pratique est ''-perm'' qui permet de sélectionner des fichiers en fonctions de leurs droits. \\ | ||
- | //Les droits peuvent être donné en forme octale ou littérale.// | + | //Les droits peuvent être donné en forme octale, par exemple 0755 ou littérale, u=rwx,g=rw,o=rw.// |
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> | + | <code user> |
- | find /bin -perm /5000 -user root<code> | + | find /bin -perm /5000 -user root</code> |
- | <code> | + | <file bash résultat de la commande précédente> |
/bin/su | /bin/su | ||
/bin/mount | /bin/mount | ||
Ligne 144: | Ligne 152: | ||
/bin/ping | /bin/ping | ||
/bin/ping6 | /bin/ping6 | ||
- | </code> | + | </file> |
Cette option est intéressante pour la sécurité. Les fichiers listés dans la commande précédente sont tous exécuté avec les droits ''root''. | Cette option est intéressante pour la sécurité. Les fichiers listés dans la commande précédente sont tous exécuté avec les droits ''root''. | ||
+ | |||
+ | <note tip> | ||
+ | **Trois notations avec ''perm'', sans préfixe, précédé du signe – ou précédé du signe /**\\ | ||
+ | |||
+ | * __sans préfixe__ : | ||
+ | le mode du fichier doit être exactement celui passé à l’option -perm.\\ Par exemple, si on cherche les fichiers ayant le mode u=rwx (0700), tous les fichiers que l’on trouvera auront exactement le mode u=rwx (0700). | ||
+ | |||
+ | * __avec le signe –__ : | ||
+ | le mode du fichier doit être au moins égal à celui passé à l’option -perm\\ -u=r (-0400) -> u=r ou u=rw ou u=rx ou u=rwx ou u=r,g=x ... | ||
+ | |||
+ | * __avec le signe /__ : | ||
+ | un des modes (user, group ou other) doit être au moins égal à ceux passés à l’option -perm\\ /u=w,g=w,o=w -> u=w ou g=w ou o=w ou u=w,g=w,o=w ou u=rw,g=rwx ... | ||
+ | </note> | ||
===== Recherche par motif ===== | ===== Recherche par motif ===== | ||
- | Pour rechercher un motif, il faut utiliser la même option, et utiliser les [[commande:regexp | REGEXP]]. | + | Pour rechercher un motif, il faut utiliser la même option, et utiliser les [[:doc:programmation:shell:regexp | REGEXP]]. |
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> | + | <code user> |
- | find . -name '*.java'<code> | + | find . -name '*.java'</code> |
- | <code> | + | <file bash résultat de la commande précédente> |
./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 163: | Ligne 184: | ||
./java/jdk1.5.0_06/demo/applets/CardTest/CardTest.java | ./java/jdk1.5.0_06/demo/applets/CardTest/CardTest.java | ||
... | ... | ||
- | </code> | + | </file> |
===== Rechercher les fichiers n'appartenant pas à l'utilisateur ===== | ===== Rechercher les fichiers n'appartenant pas à l'utilisateur ===== | ||
Ligne 171: | Ligne 192: | ||
Pour ce faire, il suffit d'exécuter là commande suivante, où « utilisateur » est à remplacer par votre nom d'utilisateur : | Pour ce faire, il suffit d'exécuter là commande suivante, où « utilisateur » est à remplacer par votre nom d'utilisateur : | ||
- | <code bash> | + | <code user> |
find /home/utilisateur ! -user utilisateur | find /home/utilisateur ! -user utilisateur | ||
</code> | </code> | ||
Ligne 177: | Ligne 198: | ||
ou bien, en utilisant des variables : | ou bien, en utilisant des variables : | ||
- | <code bash> | + | <code user> |
find $HOME ! -user $USER | find $HOME ! -user $USER | ||
</code> | </code> | ||
Ligne 183: | Ligne 204: | ||
Pour avoir davantage d'informations sur les fichiers ainsi trouvés, vous pouvez ajouter l'option ''ls'' : | Pour avoir davantage d'informations sur les fichiers ainsi trouvés, vous pouvez ajouter l'option ''ls'' : | ||
- | <code bash> | + | <code user> |
find $HOME ! -user $USER -ls | find $HOME ! -user $USER -ls | ||
</code> | </code> | ||
+ | |||
===== -exec - Exécuter une commande ===== | ===== -exec - Exécuter une commande ===== | ||
La commande **find** permet d'effectuer toute sorte d'action avec les fichiers trouvés. | La commande **find** permet d'effectuer toute sorte d'action avec les fichiers trouvés. | ||
- | Une action très utile est "''-exec''" qui permet d'exécuter une commande sur les fichiers sélectionnés. | + | Une action très utile est "''-exec''" qui permet d'exécuter une commande sur les fichiers sélectionnés. \\ |
La syntaxe de ''exec'' est particulière car il faut pouvoir fournir le nom du fichier trouvé. | La syntaxe de ''exec'' est particulière car il faut pouvoir fournir le nom du fichier trouvé. | ||
Ligne 203: | Ligne 224: | ||
Par exemple ainsi : | Par exemple ainsi : | ||
- | <code bash> | + | <code user> |
find /home/mon_user/test/ -type f -exec echo {} \+</code> | find /home/mon_user/test/ -type f -exec echo {} \+</code> | ||
Ligne 216: | Ligne 237: | ||
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> | + | <code user> |
find developpement/django/certif -name '*.py' -exec wc -l {} \;</code> | find developpement/django/certif -name '*.py' -exec wc -l {} \;</code> | ||
- | <code> | + | <file bash résultat de la commande précédente> |
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 225: | Ligne 246: | ||
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> | + | .../...</file> |
- 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 233: | Ligne 254: | ||
Comme d'habitude vous avez aussi le : | Comme d'habitude vous avez aussi le : | ||
- | <code bash> | + | <code user> |
man find</code> | man find</code> | ||
Ligne 244: | Ligne 265: | ||
Placez-vous dans un nouveau dossier créé pour l'occasion. \\ | Placez-vous dans un nouveau dossier créé pour l'occasion. \\ | ||
Exemple : | Exemple : | ||
- | <code bash> | + | <code user> |
- | cd | + | cd</code> |
- | mkdir -p ~/tmp/df_tp01/ | + | <code user>mkdir -p ~/tmp/df_tp01/</code> |
- | cd ~/tmp/df_tp01/ | + | <code user>cd ~/tmp/df_tp01/ |
</code> | </code> | ||
On va maintenant créer les fichiers et dossiers qui nous servirons pour la | On va maintenant créer les fichiers et dossiers qui nous servirons pour la | ||
suite ainsi : | suite ainsi : | ||
- | <code bash> | + | <code user> |
- | for i in $(seq 5); do mkdir toctoc$i; done | + | for i in $(seq 5); do mkdir toctoc$i; done</code> |
- | mkdir -p toctoc1/paf toctoc2/paf toctoc3/pif/paf toctoc4/paf/paf | + | <code user>mkdir -p toctoc1/paf toctoc2/paf toctoc3/pif/paf toctoc4/paf/paf</code> |
- | touch toctoc5/paf | + | <code user>touch toctoc5/paf</code> |
- | for i in $(seq 4); do for j in toctoc*; do mkdir -p $j/tchac$RANDOM; done; done | + | <code user>for i in $(seq 4); do for j in toctoc*; do mkdir -p $j/tchac$RANDOM; done; done |
</code> | </code> | ||
Ligne 263: | Ligne 284: | ||
À maîtriser absolument avant de poursuivre. | À maîtriser absolument avant de poursuivre. | ||
- | * [[manuel:repertoire | Différents types de chemin — Notion de répertoire de travail]] - Pas à pas. | + | * [[:doc:programmation:shell:repertoires | Différents types de chemin — Notion de répertoire de travail]] - Pas à pas. |
- | + | ||
===== Find, -exec et -execdir ===== | ===== Find, -exec et -execdir ===== | ||
Ligne 277: | Ligne 296: | ||
Si vous lancez un ''find'' depuis le second répertoire de ce TP, vous allez voir ce sacré bazar : | Si vous lancez un ''find'' depuis le second répertoire de ce TP, vous allez voir ce sacré bazar : | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01$ find . | ~/tmp/df_tp01$ find . | ||
</code> | </code> | ||
Par exemple, on va se concentrer sur les répertoires nommés ''paf'' : | Par exemple, on va se concentrer sur les répertoires nommés ''paf'' : | ||
- | <code bash> | + | <code user> |
- | ~/tmp/df_tp01$ find . -type d -name paf | + | ~/tmp/df_tp01$ find . -type d -name paf</code> |
+ | <file bash résultat de la commande précédente> | ||
./toctoc3/pif/paf | ./toctoc3/pif/paf | ||
./toctoc1/paf | ./toctoc1/paf | ||
Ligne 289: | Ligne 309: | ||
./toctoc4/paf/paf | ./toctoc4/paf/paf | ||
./toctoc2/paf | ./toctoc2/paf | ||
- | </code> | + | </file> |
=== Nota : === | === Nota : === | ||
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 user> |
- | ~/tmp/df_tp01$ find . -depth -type d -name paf | + | ~/tmp/df_tp01$ find . -depth -type d -name paf</code> |
+ | <file bash résultat de la commande précédente> | ||
./toctoc3/pif/paf | ./toctoc3/pif/paf | ||
./toctoc1/paf | ./toctoc1/paf | ||
Ligne 301: | Ligne 322: | ||
./toctoc4/paf | ./toctoc4/paf | ||
./toctoc2/paf | ./toctoc2/paf | ||
- | </code> | + | </file> |
==== Répertoires de travail pour -exec et -execdir ==== | ==== Répertoires de travail pour -exec et -execdir ==== | ||
Ligne 308: | Ligne 329: | ||
Affichons le répertoire de travail : | Affichons le répertoire de travail : | ||
- | <code bash> | + | <code user> |
- | ~/tmp/df_tp01$ find . -depth -type d -name paf -exec pwd \; | + | ~/tmp/df_tp01$ find . -depth -type d -name paf -exec pwd \;</code> |
+ | <file bash résultat de la commande précédente> | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
Ligne 315: | Ligne 337: | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
- | </code> | + | </file> |
- | On voit qu'ici, pour chaque dossier ''paf'' de trouvé, c'est seulement __le chemin du répertoire d'où nous lançons notre commande find__, qui est indiqué par l'exécution de [[commande:pwd | la commande : pwd]], ce qui n'est pas ce que nous voulons obtenir. 8-o | + | On voit qu'ici, pour chaque dossier ''paf'' de trouvé, c'est seulement __le chemin du répertoire d'où nous lançons notre commande find__, qui est indiqué par l'exécution de [[:doc:systeme:pwd | la commande : pwd]], ce qui n'est pas ce que nous voulons obtenir. 8-o |
Employons ''-execdir'' maintenant : | Employons ''-execdir'' maintenant : | ||
- | <code bash> | + | <code user> |
- | ~/tmp/df_tp01$ find . -depth -type d -name paf -execdir pwd \; | + | ~/tmp/df_tp01$ find . -depth -type d -name paf -execdir pwd \;</code> |
+ | <file bash résultat de la commande précédente> | ||
/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 327: | Ligne 350: | ||
/home/captnfab/tmp/df_tp01/toctoc4 | /home/captnfab/tmp/df_tp01/toctoc4 | ||
/home/captnfab/tmp/df_tp01/toctoc2 | /home/captnfab/tmp/df_tp01/toctoc2 | ||
- | </code> | + | </file> |
On voit maintenant que nous obtenons bien __le chemin de chaque répertoire contenant le dossier ''paf''__ qui est indiqué par l'exécution de pwd, ce qui était recherché. :-D | On voit maintenant que nous obtenons bien __le chemin de chaque répertoire contenant le dossier ''paf''__ qui est indiqué par l'exécution de pwd, ce qui était recherché. :-D | ||
Ligne 337: | Ligne 360: | ||
C'est on ne peut plus simple : | C'est on ne peut plus simple : | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01$ find . -depth -type d -name paf -execdir mv paf ploum \; | ~/tmp/df_tp01$ find . -depth -type d -name paf -execdir mv paf ploum \; | ||
</code> | </code> | ||
Vous pouvez vérifier que ça a bien marché avec la commande suivante : | Vous pouvez vérifier que ça a bien marché avec la commande suivante : | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01$ find . -depth -type d -name ploum | ~/tmp/df_tp01$ find . -depth -type d -name ploum | ||
</code> | </code> | ||
Ligne 351: | Ligne 374: | ||
Site de ce matelot bienveillant d'où est totalement pompé cet exercice : | Site de ce matelot bienveillant d'où est totalement pompé cet exercice : | ||
* http://wiki.chezlefab.net/tuto_nix/tp/find_01 | * http://wiki.chezlefab.net/tuto_nix/tp/find_01 | ||
- | |||
===== Une seconde version plus scolaire du TP01 ===== | ===== Une seconde version plus scolaire du TP01 ===== | ||
Ligne 358: | Ligne 380: | ||
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 user> |
cd | cd | ||
mkdir -p tmp/df_tp01/ | mkdir -p tmp/df_tp01/ | ||
Ligne 368: | Ligne 390: | ||
Voici pour la première partie : | Voici pour la première partie : | ||
- | <code bash> | + | <code user> |
touch phaute_dorthografe | touch phaute_dorthografe | ||
touch notes_temporaires | touch notes_temporaires | ||
Ligne 375: | Ligne 397: | ||
Et pour la seconde : | Et pour la seconde : | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01$ for i in $(seq 5); do mkdir toctoc$i; done | ~/tmp/df_tp01$ 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 | ~/tmp/df_tp01$ mkdir -p toctoc1/paf toctoc2/paf toctoc3/pif/paf toctoc4/paf/paf | ||
Ligne 389: | Ligne 411: | ||
l'afficher en tapant la commande ''pwd''. | l'afficher en tapant la commande ''pwd''. | ||
- | <code bash> | + | <code user> |
- | ~/tmp/df_tp01$ pwd | + | ~/tmp/df_tp01$ pwd</code> |
+ | <file bash résultat de la commande précédente> | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
~/tmp/df_tp01$ | ~/tmp/df_tp01$ | ||
- | </code> | + | </file> |
On change de répertoire de travail avec la commande ''cd''. | On change de répertoire de travail avec la commande ''cd''. | ||
Le répertoire de travail est également stocké dans la variable ''$PWD'' du shell. | Le répertoire de travail est également stocké dans la variable ''$PWD'' du shell. | ||
- | <code bash> | + | <code user> |
- | ~/tmp/df_tp01$ echo $PWD | + | ~/tmp/df_tp01$ echo $PWD</code> |
+ | <file bash résultat de la commande précédente> | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
~/tmp/df_tp01$ | ~/tmp/df_tp01$ | ||
- | </code> | + | </file> |
==== Chemin relatif / chemin absolu ==== | ==== Chemin relatif / chemin absolu ==== | ||
Ligne 444: | Ligne 468: | ||
**Attention** : Virtuellement, un chemin relatif commence **toujours** par | **Attention** : Virtuellement, un chemin relatif commence **toujours** par | ||
''./''. Cependant, en règle générale, on peut l'omettre. Exemple | ''./''. Cependant, en règle générale, on peut l'omettre. Exemple | ||
- | <code bash> | + | <code user> |
ls -lh quisuisje | ls -lh quisuisje | ||
</code> | </code> | ||
Signifie en fait : | Signifie en fait : | ||
- | <code bash> | + | <code user> |
ls -lh ./quisuisje | ls -lh ./quisuisje | ||
</code> | </code> | ||
Ligne 466: | Ligne 490: | ||
Exemples : | Exemples : | ||
* Avec deux chemins relatifs | * Avec deux chemins relatifs | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01/$ mv ./phaute_dorthografe ./faute_dorthographe | ~/tmp/df_tp01/$ mv ./phaute_dorthografe ./faute_dorthographe | ||
</code> | </code> | ||
qui signifie donc | qui signifie donc | ||
- | <code bash> | + | <code user> |
mv $PWD/./phaute_dorthografe $PWD/./faute_dorthographe | mv $PWD/./phaute_dorthografe $PWD/./faute_dorthographe | ||
</code> | </code> | ||
* Avec un chemin relatif et un chemin absolu | * Avec un chemin relatif et un chemin absolu | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01/$ mv ./notes_temporaires /tmp/notes_temporaires.txt | ~/tmp/df_tp01/$ mv ./notes_temporaires /tmp/notes_temporaires.txt | ||
</code> | </code> | ||
qui signifie | qui signifie | ||
- | <code bash> | + | <code user> |
~/tmp/df_tp01/$ mv $PWD/./notes_temporaires /tmp/notes_temporaires.txt | ~/tmp/df_tp01/$ mv $PWD/./notes_temporaires /tmp/notes_temporaires.txt | ||
</code> | </code> | ||
Ligne 494: | Ligne 518: | ||
Si vous lancez un ''find'' depuis le répertoire du tp, vous allez voir un sacré bazar : | Si vous lancez un ''find'' depuis le répertoire du tp, vous allez voir un sacré bazar : | ||
- | <code bash> | + | <code user> |
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 user> |
find . -type d -name paf</code> | find . -type d -name paf</code> | ||
- | <code> | + | <file bash résultat de la commande précédente> |
./toctoc3/pif/paf | ./toctoc3/pif/paf | ||
./toctoc1/paf | ./toctoc1/paf | ||
Ligne 507: | Ligne 531: | ||
./toctoc4/paf/paf | ./toctoc4/paf/paf | ||
./toctoc2/paf | ./toctoc2/paf | ||
- | </code> | + | </file> |
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 user> |
find . -depth -type d -name paf</code> | find . -depth -type d -name paf</code> | ||
- | <code> | + | <file bash résultat de la commande précédente> |
./toctoc3/pif/paf | ./toctoc3/pif/paf | ||
./toctoc1/paf | ./toctoc1/paf | ||
Ligne 518: | Ligne 542: | ||
./toctoc4/paf | ./toctoc4/paf | ||
./toctoc2/paf | ./toctoc2/paf | ||
- | </code> | + | </file> |
==== Répertoires de travail pour -exec et -execdir ==== | ==== Répertoires de travail pour -exec et -execdir ==== | ||
Ligne 525: | Ligne 549: | ||
répertoire de travail. | répertoire de travail. | ||
- | <code bash> | + | <code user> |
find . -depth -type d -name paf -exec pwd \;</code> | find . -depth -type d -name paf -exec pwd \;</code> | ||
- | <code> | + | <file bash résultat de la commande précédente> |
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
Ligne 533: | Ligne 557: | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
/home/captnfab/tmp/df_tp01 | /home/captnfab/tmp/df_tp01 | ||
- | </code> | + | </file> |
Comparons avec ''-execdir'' | Comparons avec ''-execdir'' | ||
Ligne 539: | Ligne 563: | ||
<code bash> | <code bash> | ||
find . -depth -type d -name paf -execdir pwd \;</code> | find . -depth -type d -name paf -execdir pwd \;</code> | ||
- | <code> | + | <file bash résultat de la commande précédente> |
/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 545: | Ligne 569: | ||
/home/captnfab/tmp/df_tp01/toctoc4 | /home/captnfab/tmp/df_tp01/toctoc4 | ||
/home/captnfab/tmp/df_tp01/toctoc2 | /home/captnfab/tmp/df_tp01/toctoc2 | ||
- | </code> | + | </file> |
On voit ici que le répertoire de travail est à chaque fois le répertoire contenant le dossier ''pif''. | On voit ici que le répertoire de travail est à chaque fois le répertoire contenant le dossier ''pif''. | ||
Ligne 555: | Ligne 579: | ||
C'est on ne peut plus simple : | C'est on ne peut plus simple : | ||
- | <code bash> | + | <code user> |
find . -depth -type d -name paf -execdir mv paf ploum \; | find . -depth -type d -name paf -execdir mv paf ploum \; | ||
</code> | </code> | ||
Ligne 561: | Ligne 585: | ||
Vous pouvez vérifier que ça a bien marché avec la commande suivante : | Vous pouvez vérifier que ça a bien marché avec la commande suivante : | ||
- | <code bash> | + | <code user> |
find . -depth -type d -name ploum | find . -depth -type d -name ploum | ||
</code> | </code> | ||
Ligne 573: | Ligne 597: | ||
On se place à la racine du répertoire cible : | On se place à la racine du répertoire cible : | ||
- | <code bash> | + | <code user> |
cd /repertoire/machin</code> | cd /repertoire/machin</code> | ||
et on tape : | et on tape : | ||
- | <code bash> | + | <code user> |
find . -depth -type f -exec sed -i 's/require(/@require_once(/g' {} \;</code> | find . -depth -type f -exec sed -i 's/require(/@require_once(/g' {} \;</code> | ||
Ligne 590: | Ligne 614: | ||
=== le chevron === | === le chevron === | ||
- | Avec [[commande:chevron|la commande chevron]] | + | Avec [[:doc:programmation:shell:chevrons|la commande chevron]] |
- | <code bash> | + | <code user> |
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> | ||
Ligne 597: | Ligne 621: | ||
Ou bien avec **xargs** : | Ou bien avec **xargs** : | ||
- | <code bash> | + | <code user> |
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> | ||
=== cp === | === cp === | ||
- | Ou encore avec [[commande:cp|la commande cp]] : | + | Ou encore avec [[:doc:systeme:cp|la commande cp]] : |
- | <code bash> | + | <code user> |
find -type f -iname nom_du_fichier -exec cp /dev/null {} \;</code> | find -type f -iname nom_du_fichier -exec cp /dev/null {} \;</code> | ||