syntaxe de c-sh à bash

syntaxe de c-sh à bash - Shell/Batch - Programmation

Marsh Posté le 19-11-2022 à 15:46:03    

Bonjour
j'ai un script de renommage que j'avais développé sous le C-Shell. Pour une raison contrainte, je suis obligé de le changer en Bourne Shell (bash). Mais je ne connais aucunement l'équivalent des syntaxes sous bsh. Qqn pourrait-il m'aider à le traduire ? Voilà le script "rename.csh" qui ici utilise la fonction sed pour enlever tous les points des fichiers .toto :  

#!/bin/csh
foreach ficname (*.toto)
 mv $ficname `echo $ficname | sed 's/.//'`  
end


Merci d'avance

Reply

Marsh Posté le 19-11-2022 à 15:46:03   

Reply

Marsh Posté le 19-11-2022 à 16:12:01    

for ficname in *.toto ; do
 mv $ficname `echo "$ficname" | sed 's/.//'`  
done


Message édité par gilou le 19-11-2022 à 16:15:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-11-2022 à 16:12:45    

Ca n'aurait pas plus sa place en cat' Linux? Enfin bon, vu que c'est déjà résolu... Bravo à gilou pour sa réactivité. ;)


---------------
Si vous ouvrez un sujet merci de ne pas le "laisser mourir" subitement et de le marquer comme "résolu" le cas échéant!
Reply

Marsh Posté le 19-11-2022 à 16:19:08    

J'ai mis $ficname entre "" dans la 2e ligne au cas ou il y aurait des espaces dans le nom de fichier. Pour un echo, ça joue pas, mais ce serait un ls...
Donc autant faire bien dès le départ.
Je re-fais du script depuis un ou deux mois (après l'avoir évité depuis des décennies)
A+,


Message édité par gilou le 19-11-2022 à 16:19:28

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-11-2022 à 16:28:07    

Mais en fait tu fais pas comme ça en bash, mais comme ci :

#!/usr/bin/env bash
for ficname in *.toto ; do
 mv "$ficname" "${ficname//./}"  
done

//./ va faire un remplacement global, si tu veux l'application juste une fois, tu fais /./
bref ${variable//pattern/substitution} ou ${variable/pattern/substitution} selon qu'on veut un remplacement global ou non
(et éventuellement, \mv si tu veux appeler la commande de base et pas un script qui s'y substituerait [très courant pour rm])
A+,


Message édité par gilou le 19-11-2022 à 16:36:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-11-2022 à 13:53:32    

Merci gilou, ton 2nd script marche très bien, même en voulant substituer le point par un espace.  
 
Pour info, en testant le premier script, il remplace le premier caractère des noms par la substitution (donc si c'est un espace, il ne met rien à la place car un espace en début de nom n'est jamais gardé). Je pense qu'il interprète le point comme un meta-caractère (comme en regex), à savoir "point" = "n'importe quel caractère", et il le fait une seule fois, dès qu'il rencontre le caractère en lisant depuis le début du nom = première lettre donc.  
En plus, il n'arrive pas à gérer les fichiers .toto qui ont des espaces en eux (pour cela il faudrait sans doute incorporer avant sed des mises en guillemets avec des exécutions par echo ou autre).
 
Bref, ton 2nd script marche à merveille. Merci !
 
ps : oui, l'admin peut translater le post en "Linux" si nécessaire

Reply

Marsh Posté le 20-11-2022 à 13:57:47    

ah j'ai pas vu, il y avait bien un echo et des guillemets dans le 1er script   :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed