Find & Sed.
Résolu/Fermé
A voir également:
- Find & Sed.
- Ava find - Télécharger - Divers Utilitaires
- Partition find and mount - Télécharger - Récupération de données
- An exception occurred in the driver: could not find driver - Forum PHP
- Find junk files - Télécharger - Nettoyage
- Sed supprimer ligne - Astuces et Solutions
11 réponses
jivef
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
306
Modifié par jivef le 18/04/2012 à 06:40
Modifié par jivef le 18/04/2012 à 06:40
Bonjour,
-1 ) Avant de se lancer dans de grandes aventures sur ce type de fichier, il faut penser à l'impensable...
Donc commencer par faire une sauvegarde.
-2 ) "J'aimerais remplacer ces .crdf.net par des .com. -> ça avec Sed je sais faire"
Il y a en effet une option de sed qui te permet de modifier directement le fichier, mais visiblement tu ne l'utilisais pas.
Le manuel est ton ami... Mais je t'aide un peu : C'est l'option -i
-3) "Maintenant, on a aussi des fichiers .sql contenant ces occurrences un peu partout dans un dossier."
Dans ce cas là, il faut procéder par étape.
Lorsqu'on travaille un peu dans l'urgence, il faut toujours faire un brouillon avant, je travaille toujours comme ça et au lieu de me faire perdre du temps, ca m'en fait gagner.
for i in $(find /monchemin -name \*.sql)
do
echo $i
done
Ca marche OK, alors on fonce.
for i in $(find /monchemin -name \*.sql)
do
sed -i "s/\.crdf\.net/\.com/g"
done
Ta ligne de commande était plutôt bien vue, mais tu avais fait quatre erreurs qui produisaient probablement un résultat nul, voire même un message d'insulte... (ou d'erreur)
1- tu as échappé bizarrement le caractère * de *.sql
Il faut l'échapper avec \ comme je l'ai fait.
2 -Tu as mal encapsulé ta commande find. tu commences avec ', tu termines avec " et tu tente vaguement d'échapper * avec '
NON... j'ai fait un copier/coller pour voir et j'ai compris...
Et bien en effet tu as bouletisé... (néologisme)
Les guillemets vont par paire toujours, mais si tu ouvres un guillemet, le suivant est forcément interprété comme celui fermant le premier.
Donc ce que tu as écrit :
'find -name ' est une expression entre guillemets...
Ensuite
*.sql est hors de tout guillemets
Tu as deux guillemets simples qui se suivent sans raison...
'' suivi du reste de ta commande ; do etc...
3 - Tu avais oublié l'option -i de sed.
Une chose à savoir le caractère ' (guillement du 7 du clavier azerty) passe mal dans le forum ccm.
Personnellement quand je bossais sous Solaris il y a quelques années j'avais pris l'habitude d'encapsuler avec 'ma commande' (guillement du 7 sur clavier azerty) mais maintenant je préfère la syntaxe $( ma commande) qui me semble plus pratique.
4 - Le caractère . est un expression rationnelle qui signifie "un caractère quelconque" Donc si tu veux vraiment remplacer ce . en tant que tel, il faut l'échapper avec \
Bon courage.
Jonas.
LPIC-1 ID LPI000173303 verif uhjgvpcuxh
-1 ) Avant de se lancer dans de grandes aventures sur ce type de fichier, il faut penser à l'impensable...
Donc commencer par faire une sauvegarde.
-2 ) "J'aimerais remplacer ces .crdf.net par des .com. -> ça avec Sed je sais faire"
Il y a en effet une option de sed qui te permet de modifier directement le fichier, mais visiblement tu ne l'utilisais pas.
Le manuel est ton ami... Mais je t'aide un peu : C'est l'option -i
-3) "Maintenant, on a aussi des fichiers .sql contenant ces occurrences un peu partout dans un dossier."
Dans ce cas là, il faut procéder par étape.
Lorsqu'on travaille un peu dans l'urgence, il faut toujours faire un brouillon avant, je travaille toujours comme ça et au lieu de me faire perdre du temps, ca m'en fait gagner.
for i in $(find /monchemin -name \*.sql)
do
echo $i
done
Ca marche OK, alors on fonce.
for i in $(find /monchemin -name \*.sql)
do
sed -i "s/\.crdf\.net/\.com/g"
done
Ta ligne de commande était plutôt bien vue, mais tu avais fait quatre erreurs qui produisaient probablement un résultat nul, voire même un message d'insulte... (ou d'erreur)
1- tu as échappé bizarrement le caractère * de *.sql
Il faut l'échapper avec \ comme je l'ai fait.
2 -Tu as mal encapsulé ta commande find. tu commences avec ', tu termines avec " et tu tente vaguement d'échapper * avec '
NON... j'ai fait un copier/coller pour voir et j'ai compris...
Et bien en effet tu as bouletisé... (néologisme)
Les guillemets vont par paire toujours, mais si tu ouvres un guillemet, le suivant est forcément interprété comme celui fermant le premier.
Donc ce que tu as écrit :
'find -name ' est une expression entre guillemets...
Ensuite
*.sql est hors de tout guillemets
Tu as deux guillemets simples qui se suivent sans raison...
'' suivi du reste de ta commande ; do etc...
3 - Tu avais oublié l'option -i de sed.
Une chose à savoir le caractère ' (guillement du 7 du clavier azerty) passe mal dans le forum ccm.
Personnellement quand je bossais sous Solaris il y a quelques années j'avais pris l'habitude d'encapsuler avec 'ma commande' (guillement du 7 sur clavier azerty) mais maintenant je préfère la syntaxe $( ma commande) qui me semble plus pratique.
4 - Le caractère . est un expression rationnelle qui signifie "un caractère quelconque" Donc si tu veux vraiment remplacer ce . en tant que tel, il faut l'échapper avec \
Bon courage.
Jonas.
LPIC-1 ID LPI000173303 verif uhjgvpcuxh
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
18 avril 2012 à 06:39
18 avril 2012 à 06:39
Salut,
Le ".bak" est facultatif, mais sait-on jamais ;-)
find /chemin -type f -name '*.sql' -exec sed -i.bak 's/\.crdf\.net/.com/g' {} \;
Le ".bak" est facultatif, mais sait-on jamais ;-)
jivef
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
306
Modifié par jivef le 18/04/2012 à 07:33
Modifié par jivef le 18/04/2012 à 07:33
Bonjour,
Pour Saachaa :
En fait lorsque l'on utilise -i avec sed, on peut préciser une extension pour éventuellement faire une copie de sauvegarde du fichier.
C'est ce qu'a fait zipe31 dans son exemple.
LPIC-1 LPI000173303 Vérif : uhjgvpcuxh
Pour Saachaa :
En fait lorsque l'on utilise -i avec sed, on peut préciser une extension pour éventuellement faire une copie de sauvegarde du fichier.
C'est ce qu'a fait zipe31 dans son exemple.
LPIC-1 LPI000173303 Vérif : uhjgvpcuxh
Utilisateur anonyme
18 avril 2012 à 13:29
18 avril 2012 à 13:29
Salut les amis !
Oui, je vais faire tout ça :-).
J'avais déjà une sauvegarde, car on ne sait jamais.
Ensuite, pour te répondre jivef.
1- Je n'avais pas pensé à "échapper" le *.
2- Je me souviens bien avoir tapé ', et non ' ou "... Je connais leur différence, sûrement de l'intention.
3- Je ne connaissais pas -i, donc...
De toute façon je savais que ma commande ne serait pas bonne, et plutôt que d'aller farfouiller à droite et à gauche et recommencer à chaque erreur, j'ai préférer poster sur le forum sachant pertinemment que Zipe serait là ;-).
Enfin bref, je regarderai ça à tête reposée ce soir, merci à vous :-).
Oui, je vais faire tout ça :-).
J'avais déjà une sauvegarde, car on ne sait jamais.
Ensuite, pour te répondre jivef.
1- Je n'avais pas pensé à "échapper" le *.
2- Je me souviens bien avoir tapé ', et non ' ou "... Je connais leur différence, sûrement de l'intention.
3- Je ne connaissais pas -i, donc...
De toute façon je savais que ma commande ne serait pas bonne, et plutôt que d'aller farfouiller à droite et à gauche et recommencer à chaque erreur, j'ai préférer poster sur le forum sachant pertinemment que Zipe serait là ;-).
Enfin bref, je regarderai ça à tête reposée ce soir, merci à vous :-).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jivef
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
306
19 avril 2012 à 23:39
19 avril 2012 à 23:39
Salut,
Compte un peu moins sur les autres et procède par touches successives, comme ce que je t'ai expliqué.
Le meilleur moyen d'apprendre est d'expérimenter pas d'attendre que les autres te donne leur résultats.
Je t'ai aidé parce que tu avais déjà un morceau de la solution et j'ai continué dans la même direction que toi, même si j'ai hésité à te proposer l'option -exec de find comme l'a fait zipe31.
Expérimente la commande find, elle te servira toujours et il y a tellement d'options que tu peux chercher quasiment tout.
Tu peux même rechercher des fichiers dont le propriétaire ou le groupe a été supprimé, par exemple... (avec -uid ou gid)
Tu peux chercher des fichiers modifiés il y un nombre de fixe de jours, au-delà, avant, etc...
Tu peux même passer des commandes avec -exec.
Et puis apprend la syntaxe, les echappements, les expressions régulières aussi.
chez toi, mange des boucles et des tests conditionnels à toutes les sauces, c'est comme ça que tu les maîtriseras.
Lorsque tu as un moment de libre au boulot, fais-en autant.
C'est un plaisir quand au boulot je vois qu'on compte sur moi pour faire un script compliqué.
C'est un plaisir aussi de voir les yeux incrédules de mes collègues quand je leur dit que je peux faire telle opération complexe automatiquement avec un script et qu'ils constatent que peu de temps après je peux leur clouer le bec avec GNU/linux.
Pour en arriver là, j'ai expérimenté, travaillé. C'est un investissement en temps car je ne suis pas sorti d'une école d'ingénieur donc au départ je n'étais pas censé avoir les bases...
Mais c'est vraiment agréable d'en arriver là.
Bien cordialement.
Jonas.
"De toute façon je savais que ma commande ne serait pas bonne, et plutôt que d'aller farfouiller à droite et à gauche et recommencer à chaque erreur, j'ai préférer poster sur le forum sachant pertinemment que Zipe serait là"
Compte un peu moins sur les autres et procède par touches successives, comme ce que je t'ai expliqué.
Le meilleur moyen d'apprendre est d'expérimenter pas d'attendre que les autres te donne leur résultats.
Je t'ai aidé parce que tu avais déjà un morceau de la solution et j'ai continué dans la même direction que toi, même si j'ai hésité à te proposer l'option -exec de find comme l'a fait zipe31.
Expérimente la commande find, elle te servira toujours et il y a tellement d'options que tu peux chercher quasiment tout.
Tu peux même rechercher des fichiers dont le propriétaire ou le groupe a été supprimé, par exemple... (avec -uid ou gid)
Tu peux chercher des fichiers modifiés il y un nombre de fixe de jours, au-delà, avant, etc...
Tu peux même passer des commandes avec -exec.
Et puis apprend la syntaxe, les echappements, les expressions régulières aussi.
chez toi, mange des boucles et des tests conditionnels à toutes les sauces, c'est comme ça que tu les maîtriseras.
Lorsque tu as un moment de libre au boulot, fais-en autant.
C'est un plaisir quand au boulot je vois qu'on compte sur moi pour faire un script compliqué.
C'est un plaisir aussi de voir les yeux incrédules de mes collègues quand je leur dit que je peux faire telle opération complexe automatiquement avec un script et qu'ils constatent que peu de temps après je peux leur clouer le bec avec GNU/linux.
Pour en arriver là, j'ai expérimenté, travaillé. C'est un investissement en temps car je ne suis pas sorti d'une école d'ingénieur donc au départ je n'étais pas censé avoir les bases...
Mais c'est vraiment agréable d'en arriver là.
Bien cordialement.
Jonas.
Utilisateur anonyme
19 avril 2012 à 23:47
19 avril 2012 à 23:47
Salut,
Je suis tout à fait d'accord avec toi sur tous les points. Je ne peux rien rajouter..
Je suis tout à fait d'accord avec toi sur tous les points. Je ne peux rien rajouter..
Utilisateur anonyme
7 mai 2012 à 21:42
7 mai 2012 à 21:42
Salut,
Désolé de déterrer le topic ;-).
J'ai du temps à consacrer à ça alors...
En fait, mon erreur a été de vouloir faire trois choses.
1, je parcours les données récursivement, 2, j'ouvre le fichier concerné, et 3, je modifie pour ensuite passer au suivant.
Autrement dit, une condition supplémentaire pour For..
Commands which accept address ranges
{ Begin a block of commands (end with a }).
Je ne comprends pas pourquoi on doit utiliser {} ?
Pourquoi utiliser \ à la fin devant le ; ?
Bonne soirée ;-)
Désolé de déterrer le topic ;-).
J'ai du temps à consacrer à ça alors...
En fait, mon erreur a été de vouloir faire trois choses.
1, je parcours les données récursivement, 2, j'ouvre le fichier concerné, et 3, je modifie pour ensuite passer au suivant.
Autrement dit, une condition supplémentaire pour For..
find /chemin -type f -name '*.sql' -exec sed -i.bak 's/\.crdf\.net/.com/g' {} \;
Commands which accept address ranges
{ Begin a block of commands (end with a }).
Je ne comprends pas pourquoi on doit utiliser {} ?
Pourquoi utiliser \ à la fin devant le ; ?
Bonne soirée ;-)
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
7 mai 2012 à 22:56
7 mai 2012 à 22:56
Salut,
Je ne comprends pas pourquoi on doit utiliser {} ?
Les "{}" remplacent chaque instance du motif trouvé selon les critères donnés à la commande "find".
Pourquoi utiliser \ à la fin devant le ; ?
Le ";" est le caractère finissant chaque commande passée à l'option "-exec". Comme le ";" est aussi un caractère réservé du shell, il faut le protéger afin qu'il ne soit pas interprété par le shell en cours.
Je ne comprends pas pourquoi on doit utiliser {} ?
Les "{}" remplacent chaque instance du motif trouvé selon les critères donnés à la commande "find".
Pourquoi utiliser \ à la fin devant le ; ?
Le ";" est le caractère finissant chaque commande passée à l'option "-exec". Comme le ";" est aussi un caractère réservé du shell, il faut le protéger afin qu'il ne soit pas interprété par le shell en cours.
Utilisateur anonyme
7 mai 2012 à 23:58
7 mai 2012 à 23:58
Okay pour le ;, comme dans For.
Les "{}" remplacent chaque instance du motif trouvé selon les critères donnés à la commande "find".
Càd ? Au niveau des fichiers trouvés ?
Parce-que c'est Sed qui va remplacer les occurrences non ?
Les "{}" remplacent chaque instance du motif trouvé selon les critères donnés à la commande "find".
Càd ? Au niveau des fichiers trouvés ?
Parce-que c'est Sed qui va remplacer les occurrences non ?
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
8 mai 2012 à 11:16
8 mai 2012 à 11:16
Okay pour le ;, comme dans For.
Euh... pas du tout ;-\
De quel "for" tu parles ?
Les "{}" remplacent chaque instance du motif trouvé selon les critères donnés à la commande "find".
Càd ? Au niveau des fichiers trouvés ?
Oui. Les "{}" remplacent chaque fichier trouvé et lui applique la commande précisée par l'option "-exec".
Parce-que c'est Sed qui va remplacer les occurrences non ?
Oui, mais "sed" remplace les occurrences correspondants à son motif (celui entre les "/.../", alors que les "{}" correspondes aux occurrences (ou instances) de la commande "find" et de ses critères de recherche, à savoir "-name '*.sql'", soit tous les fichiers d'extension ".sql".
Euh... pas du tout ;-\
De quel "for" tu parles ?
Les "{}" remplacent chaque instance du motif trouvé selon les critères donnés à la commande "find".
Càd ? Au niveau des fichiers trouvés ?
Oui. Les "{}" remplacent chaque fichier trouvé et lui applique la commande précisée par l'option "-exec".
Parce-que c'est Sed qui va remplacer les occurrences non ?
Oui, mais "sed" remplace les occurrences correspondants à son motif (celui entre les "/.../", alors que les "{}" correspondes aux occurrences (ou instances) de la commande "find" et de ses critères de recherche, à savoir "-name '*.sql'", soit tous les fichiers d'extension ".sql".
Utilisateur anonyme
8 mai 2012 à 12:12
8 mai 2012 à 12:12
Pour For je me suis comprit, peut-être pas le meilleur exemple.
Merci pour l'aide apporté ;-))
Merci pour l'aide apporté ;-))
jivef
Messages postés
927
Date d'inscription
mercredi 11 août 2004
Statut
Membre
Dernière intervention
12 novembre 2020
306
12 mai 2012 à 23:46
12 mai 2012 à 23:46
Salut,
En fait le \ permet d'échapper un caractère, comme je te l'avais expliqué au début.
Le ; ayant une signification spéciale, il est nécessaire de l'échapper.
Quand tu utilises find avec -exec ou -rm il te faut utiliser les accolades. Le résultat de find passe entre les accolades et subit le traitement demandé par -exec ou -rm.
Mais évidemment on ne le voit pas...
A plus.
En fait le \ permet d'échapper un caractère, comme je te l'avais expliqué au début.
Le ; ayant une signification spéciale, il est nécessaire de l'échapper.
Quand tu utilises find avec -exec ou -rm il te faut utiliser les accolades. Le résultat de find passe entre les accolades et subit le traitement demandé par -exec ou -rm.
Mais évidemment on ne le voit pas...
A plus.
Utilisateur anonyme
13 mai 2012 à 10:33
13 mai 2012 à 10:33
Hey,
J'avais comprit pour échapper le caractère, mais je ne voyais pas ce que le ; venait faire ici :).
Merci.
J'avais comprit pour échapper le caractère, mais je ne voyais pas ce que le ; venait faire ici :).
Merci.