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 | ||
doc:systeme:find [22/09/2013 23:31] 127.0.0.1 modification externe |
doc:systeme:find [24/10/2022 18:38] (Version actuelle) Jean-Pierre Pinson [Rechercher pour supprimer] |
||
---|---|---|---|
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 : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | + | * Suivi : |
+ | * Création par [[user>martin_mtl]] le 09/12/2012 | ||
+ | * 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 !)) | ||
+ | |||
+ | ===== 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 19: | ||
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 33: | Ligne 36: | ||
^ Options ^ Fonctions ^ | ^ 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)// | | + | |-atime n ou +n ou -n |//trouve les fichiers auxquels on a accédé il y a strictement n jours, ou 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 ou -n |//trouve les fichiers modifiés il y a strictement n jours, ou 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)// | | |-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// | | |-name |//recherche par motif en respectant la casse// | | ||
Ligne 43: | Ligne 46: | ||
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 51: | Ligne 54: | ||
- "''-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 finit 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''. |
- | <note>Règle général, on recherche rarement un fichier depuis la racine.</note> | + | <note>Règle générale, on recherche rarement un fichier depuis la racine.</note> |
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> | + | <code user> |
find /home/martin -name 'note*'</code> | find /home/martin -name 'note*'</code> | ||
Ligne 70: | Ligne 74: | ||
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 [[:doc:systeme: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 83: | ||
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 89: | ||
/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 99: | ||
==== 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 108: | ||
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 : [[:doc:programmation:shell: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 ===== | ||
- | + | Une 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. | + | |
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. | 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. | ||
Ligne 120: | Ligne 125: | ||
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 150: | ||
/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 ===== | ||
Ligne 154: | Ligne 173: | ||
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 182: | ||
./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 190: | ||
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 196: | ||
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 202: | ||
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 198: | Ligne 217: | ||
- La paire d'accolade est automatiquement remplacée par le nom du fichier, | - La paire d'accolade est automatiquement remplacée par le nom du fichier, | ||
- | - et le point virgule final permet de marquer la fin de la commande. | + | - et le point-virgule final permet de marquer la fin de la commande. |
- | Au cas où plusieurs fichiers sont traités __dans un même répertoire__, pour éviter une relance de la commande après chaque fichier trouvé, remplacer le '';'' (point virgule) final par le signe positif : ''+''. | + | Au cas où plusieurs fichiers sont traités __dans un même répertoire__, pour éviter une relance de la commande après chaque fichier trouvé, remplacer le '';'' (point-virgule) final par le signe positif : ''+''. |
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 210: | Ligne 229: | ||
De la même manière, évitez les références vides ou les noms de répertoires exprimés en relatif dans **$PATH**.</note> | De la même manière, évitez les références vides ou les noms de répertoires exprimés en relatif dans **$PATH**.</note> | ||
- | <note important>Cette commande est difficile à utiliser sur certains shell car ceux-ci donnent une signification particulière des caractères comme l'accolade ou le point virgule.</note> | + | <note important>Cette commande est difficile à utiliser sur certains shell car ceux-ci donnent une signification particulière des caractères comme l'accolade ou le point-virgule.</note> |
- | Avec **Bash**, la //paire d'accolades sans espace// (''{}'') ne doit pas être protégée, au contraire du// point virgule// qui doit lui être echappé à l'aide d'un backslash: ''\;''. | + | Avec **Bash**, la //paire d'accolades sans espace// (''{}'') ne doit pas être protégée, au contraire du// point-virgule// qui doit être échappé à l'aide d'un backslash: ''\;''. |
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 244: | ||
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 252: | ||
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 263: | ||
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 264: | Ligne 283: | ||
* [[:doc:programmation:shell:repertoires | 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 294: | ||
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 307: | ||
./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 320: | ||
./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 327: | ||
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 335: | ||
/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 [[:doc:systeme: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 348: | ||
/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 358: | ||
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 372: | ||
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 378: | ||
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</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 serviront pour la |
suite. | suite. | ||
Voici pour la première partie : | Voici pour la première partie : | ||
- | <code bash> | + | <code user> |
- | touch phaute_dorthografe | + | touch phaute_dorthografe</code> |
- | touch notes_temporaires | + | <code user>touch notes_temporaires</code> |
- | ~/tmp/df_tp01$ touch quisuisje | + | <code user>~/tmp/df_tp01$ touch quisuisje |
</code> | </code> | ||
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</code> |
- | ~/tmp/df_tp01$ mkdir -p toctoc1/paf toctoc2/paf toctoc3/pif/paf toctoc4/paf/paf | + | <code user>~/tmp/df_tp01$ mkdir -p toctoc1/paf toctoc2/paf toctoc3/pif/paf toctoc4/paf/paf</code> |
- | ~/tmp/df_tp01$ touch toctoc5/paf | + | <code user>~/tmp/df_tp01$ touch toctoc5/paf</code> |
- | ~/tmp/df_tp01$ for i in $(seq 4); do for j in toctoc*; do mkdir -p $j/tchac$RANDOM; done; done | + | <code user>~/tmp/df_tp01$ for i in $(seq 4); do for j in toctoc*; do mkdir -p $j/tchac$RANDOM; done; done |
</code> | </code> | ||
Ligne 389: | Ligne 409: | ||
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 466: | ||
**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 488: | ||
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 516: | ||
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 529: | ||
./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 540: | ||
./toctoc4/paf | ./toctoc4/paf | ||
./toctoc2/paf | ./toctoc2/paf | ||
- | </code> | + | </file> |
+ | |||
+ | //Fastoche ! Merci// **captnfab** :-D | ||
==== 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'' | ||
- | <code bash> | + | <code user> |
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''. | ||
+ | |||
+ | ==== Copier un fichier dans plusieurs répertoires ==== | ||
+ | |||
+ | - Soit un fichier unique : **fichier1** | ||
+ | - à copier avec rsync dans tous les sous-répertoires de /media/rep1/rep2/ dont le nom commence par le chiffre ''1'' | ||
+ | <code user>find /media/rep1/rep2/ -maxdepth 1 -type d -iname '1*' -exec rsync -avz fichier1 "{}/" \;</code> | ||
+ | <code config retour de la commande find>sending incremental file list | ||
+ | fichier1 | ||
+ | |||
+ | sent 518,342 bytes received 35 bytes 345,584.67 bytes/sec | ||
+ | total size is 2,197,504 speedup is 4.24 | ||
+ | sending incremental file list | ||
+ | fichier1 | ||
+ | […]</code> | ||
+ | |||
+ | La commande peut évidemment être adaptée si le filtre sur le nom est différent (ou s'il n'y a pas de filtre sur le nom), ou si ce sont des sous-sous-répertoires, ou si ce sont des fichiers à remplacer, ou si la copie doit être faite avec ''cp'', etc. | ||
==== Renommer les répertoires ==== | ==== Renommer les répertoires ==== | ||
Ligne 555: | Ligne 595: | ||
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 601: | ||
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> | ||
Vous pouvez voir l'original là : | Vous pouvez voir l'original là : | ||
- | * http://wiki.chezlefab.net/tuto_nix/tp/find_01bis | + | * Obsolète : wiki.chezlefab.net/tuto_nix/tp/find_01bis |
==== Renommer une chaîne de caractère dans des fichiers ==== | ==== Renommer une chaîne de caractère dans des fichiers ==== | ||
Ligne 573: | Ligne 613: | ||
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 584: | Ligne 624: | ||
//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 fichier ==== |
Pour effacer le contenu d'un fichier | Pour effacer le contenu d'un fichier | ||
Ligne 591: | Ligne 631: | ||
Avec [[:doc:programmation:shell:chevrons|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 637: | ||
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> | ||
Ligne 603: | Ligne 643: | ||
Ou encore avec [[:doc:systeme: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> | ||