|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Technicien réseau Inscription : avril 2011 Messages : 15 ![]() |
bonjour,
j'essaie comprendre ce qui est dit dans l'article ci-dessous http://en.wikipedia.org/wiki/Xargs#cite_note-1 Notamment ceci si on tape les commandes suivantes Code :
En fait la commande suivante apporte la solution (après avoir créé les fichiers en question par les commandes touch) Code :
find -name not\* | tr \\n \\0 | xargs -0 rm Je vois bien que çà marche (encore une fois c'est surprenant), mais je ne sais pas EXACTEMENT pourquoi....le problème des séparateurs et (plus généralement) des commandes qui sont ou non orientées ligne me paraît complexe....je ne sais jamais quel est le caractère de fin de ligne Pourriez vous me donner une explication sur l'exemple précédent ? Merci d'avance |
||
|
|
01
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 534 ![]() |
Code :
pourquoi ? la protection de caractère "\\" en lien et place de "\" vient du fait qu'on traverse un tunnel "|" pour arriver à rm hors l'usage des "|" doit tjrs être réduit au minimum pour des raisons évidentes de temps de traitement, c'est pourquoi la vraie solution n'est absolument pas celle mentionnée mais bel et bien d'utiliser l'option exec de find comme je l'ai indiqué. |
||
|
|
20
|
|
|
#3 |
|
Futur Membre du Club
![]() Technicien réseau Inscription : avril 2011 Messages : 15 ![]() |
cependant cela ne m'explique pas pourquoi dans la solution non optimisée qui est proposée on change le caractère de fin de ligne \n en \0 avant d'exécuter la commande rm
|
|
|
01
|
|
|
#4 |
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
Je pense que c'est parce que find ne protège pas ses résultats avec des guillemets, ce qui fait que la commande :
équivaut en fait au final à : et non : Ce qui supprime le fichier « not » et le fichier « important_file ». Comme le fichier « not » n'existe pas, seul « important_file » est supprimé. Ce qui montre les limites de find, et pourquoi il faut plutôt utiliser son option exec dans ce genre de cas. Mais peut-être me trompé-je.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
|
|
30
|
|
|
#5 | ||
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
Pour les \n.
En fait la commande finale, que j'avais shématisée par : une fois interprétée serait plutôt quelque chose du genre : C'est imagé hein juste pour illustrer comment le shell passe les fichiers à rm. Le shell a par défaut comme séparateurs d'arguments l'espace la tabulation et le retour à la ligne. Il découpe donc le résultat de find, et convertit les espaces en retours à la ligne afin de délimiter ce qu'il donne à rm. Donc le tr remet l'ensemble des arguments sur une seule ligne, puis xargs comvertit les \0 en espaces grâce à son option -0. Pour s'en convaincre : Code :
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
||
|
|
30
|
|
|
#6 | |||||||||||||||||||||
|
Membre Expert
![]() |
Je ne suis pas tout à fait d'accord avec plusieurs infos des messages précédents, donc je vais donner mon point de vue
1) Explication du non fonctionnement de find -name not\* | xargs rm. Cette commande signifie comme vous le savez que la sortie standard de find est dirigée vers l'entrée standard de rm. Donc, cela revient à faire : Code :
Code :
Mais comme indiqué par FRUiT, ce nom comportant un espace, si on le passe tel quel à rm, cela revient à faire la commande suivante rm ./not important_file. Dans ce cas, rm cherche effectivement à supprimer 2 fichier : "./not" et "important_file". 2) Que faire pour contourner le problème ? 1ère solution pour un cas simple, utiliser l'option de find -exec comme indiqué par frp31 ! 2ème solution utile si exec ne permet pas de faire ce que l'on veut : utiliser proprement xargs Dans le cas de noms relativement simples comme ici, l'option -I{} de xargs permet de travailler proprement (anciennement option -i). Citation:
Concrètement, voici une explication avec un exemple : Code :
Code :
2.2) Second cas avec l'option -I{}: Code :
Mais il peut rester un problème avec cette option -I{} ! 3) Le cas le plus compliqué qu'on verra ici : un nom de fichier comportant un saut de ligne ou des caractères spéciaux... Code :
C'est là qu'intervient l'option -0 (c'est un zéro) de xargs : Citation:
Citation:
![]() Ces deux options permettent, pour find, de séparer les différents noms trouvés par des caractères nulls plutôt que des sauts de ligne et pour xargs, de lire les arguments en découpant en suivant les caractères nulls au lieu des espaces (conséquence indirecte, les caractères spéciaux sont interprétés directement). Code :
Code :
On voit également que le saut de ligne du fichier "not important_file at_all" est bien présent dans le fichier test_rm ! Et que c'est finalement le seul saut de ligne du fichier. Et pour conclure, la solution suivante est à proscrire d'une manière générale : Code :
Il faut utiliser l'option -print0 de find qui fait le boulot correctement à la source. Je ne sais pas si certains vont lire ça, mais j'espère que c'est clair :p |
|||||||||||||||||||||
|
|
40
|
|
|
#7 |
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
Oui mais la commande c'est un exemple didactique inventé par des professeurs que l'on croise dans plusieurs tutos de shell, c'est absolument pas une solution. Evidemment qu'en pratique personne ne ferait une chose pareille. C'est souvent le cas des exemples didactiques ils sont très shématiques et n'ont pas vocation à être utilisés réellement.
Syncope-nc veut juste une explication du comportement induit par cet exemple du tutoriel, pas une autre solution plus efficace pour pour supprimer un fichier avec espace, ce qu'à mon avis il sait faire. Enfin c'est que j'avais cru comprendre de son premier post.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
|
|
30
|
|
|
#8 | ||||||||||||
|
Membre Expert
![]() |
Moi, en lisant son post, j'ai plutôt compris qu'il ne comprenait pas complètement ce qu'il se passait, et je pense que plutôt que de donner une explication avec un tr bancale au milieu, il vaudrait mieux donner une explication en détaillant précisément le comportement des différents programme, sans se restreindre en plus au cas particulier de l'espace
L'enchainement de commandes est la base même du fonctionnement des système Unix/Linux, donc c'est essentiel de comprendre parfaitement ce qui se passe ! D'où l'objet de mon message que j'ai voulu exhaustif. J'aurais effectivement pu me contenter de répondre à sa question avec une réponse comme celle que je donne ci-dessous, mais je préfère l'explication complète qui, je le pense, apporte plus d'informations et est plus correcte. Citation:
D'autre part, on a un programme xargs qui construit une liste d'argument séparés par des espaces (non protégés par des guillemets, des quotes ou des backslash) ou encore par des sauts à la ligne. Citation:
Code :
Code :
Code :
En revanche, en utilisant l'option -0 de xargs combinée au tr, les noms retournés par find ne sont plus séparés par des sauts de lignes mais par des caractères nulls : Code :
Code :
|
||||||||||||
|
|
50
|
|
|
#9 | ||
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
Citation:
Citation:
Ceci dit je suis d'accord pour les détails et autres séparateurs. Je pense que ton second message conviendra bien mieux à syncope, c'est d'ailleurs à peu de chose près ce que j'avais un peu plus maladroitement tenté d'expliquer aussi (plus schématiquement avec des foo et des bar).
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
||
|
|
30
|
|
|
#10 | ||||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Citation:
Citation:
Je rajouterai juste pour ma part, une petite pirouette pour mieux interpréter visuellement et apprécier les exemples ci-dessous, notamment l'utilisation de "-print0" : Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||||
|
|
40
|
|
|
#11 |
|
Membre Expert
![]() |
Oui, j'aurais du utiliser cat -A dans mes exemples plutôt que cat, tu as parfaitement raison zipe31
Pour le reste, je laisse syncope_nc ou d'autres lire ce qu'ils veulent et en tirer les enseignements nécessaires. Diffuser quelques bonnes pratiques n'ont jamais fait de mal :p surtout que je suis certain que nombreuses sont les personnes à ne pas connaitre ces détails de fonctionnement. |
|
|
21
|
|
|
#12 | |
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
Citation:
Mais lui proposer l'option -exec (ou une autre solution viable) n'est pas ce qu'il attendait. En tout cas c'est mon avis et je le partage.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
|
|
|
30
|
|
|
#13 | |
|
Membre éclairé
![]() Inscription : février 2011 Messages : 83 ![]() |
Citation:
Son premier message moi je le vois plus comme une proposition de solutions alternatives (fort bien expliquées du reste). Le deuxième en revanche est très bien oui.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee "Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley) clean |
|
|
|
30
|
|
|
#14 |
|
Futur Membre du Club
![]() Technicien réseau Inscription : avril 2011 Messages : 15 ![]() |
je remercie notamment Alek-C pour ce cours très complet que j'ai lu ET RELU et que je conserverai pour le relire encore, après "décantation" dans mon esprit, dans quelques jours ou quelques semaines. Je remercie également tous les autres membres qui m'ont répondu et donné d'autres solutions: effectivement, ma démarche est de comprendre "sur le fond"; un newbie (même si je n'en suis plus tout à fait un) essaie toujours de demander aux autres le minimum sur un exemple précis pour ne pas "trop déranger", mais il espère à travers ce service minimum "gratuit" (donc inespéré) que la réponse sera la plus complète possible pour qu'il puisse avancer dans la compréhension des mécanismes subtils des commandes du shell.....donc évidemment, j'ai très apprécié toute cette discussion et les réponses très complètes qui me permettent de comprendre, et également tous les conseils sur les utilisations plus optimisées qu'il faut utiliser dans un contexte opérationnel....merci encore
|
|
|
10
|
Copyright © 2000-2012 - www.developpez.com