Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/03/2010, à 11:23

olsman037

[RESOLU] help pour 'script' sed et rename...

Bonjour à tous,

Je travaille sous stata, et avec mes collegues on se refile les programmes... seulement voila, les chemins sont de type C:\data\etc... et il est hors de question que je repasse sous windows...

Donc je me suis dis, un petit script, avec du sed dedans, arrangerai bien les choses

Voila ce que j'ai fais :

rename 's/.do/.dos/g' *.do
sed -i.do '/C:\\/s|\\|/|g;/C:\//s|C:/|/home/moi/|g' *.dos
rename 's/.dos.do/_dos.do/g' *.dos.do
rename 's/.dos/_unix.do/g' *.dos

Résultat je me retrouve avec le fichier initial venant de windows qui s'appelle 'anciennom_dos.do' et le nouveau avec 'anciennom_unix.do'
Sachant qu'il ne change que les chemins (que pour les lignes où l'on retrouve 'C:\' je suis super fier d'avoir trouvé ça tongue )

Et je me suis fais la même chose pour renvoyer mes fichiers transformés

sed -i.old '/\/home\/moi\//s|/|\\|g;/\\home\\leo\\/s|\\home\\moi\\|C:\\|g' *_unix.do
rm *_dos.do
rename 's/_unix.do/.do/g' *_unix.do
rename 's/_unix.do.old/_unix.do/g' *_unix.do.old

Je me retrouve donc avec un fichier 'ancien_nom.do' pour renvoyer à mes collègues, avec les bons noms de chemin, et toujours mon fichier 'anciennom_unix.do'

J'en viens à mon problème.. admettons qu'ils me renvoient plusieurs fichiers, je refais tourner mon script et là c'est le drame, ça double tout mes fichiers... Je cherche donc un moyen pour que mon premier script ne fonctionne que sur les fichiers *.do sauf ceux dont le nom contient '_unix.do'

Et en passant, si vous aviez une solution pour copier tout les fichiers du repertoire courant en les renommant automatiquement (genre rajouter.bak ou un truc comme ça), je suis preneur aussi.. j'ai cherché dans mv et cp et j'ai rien trouvé (il se peut que je ne sache pas chercher hmm )

Merci à vous...

Dernière modification par olsman037 (Le 12/03/2010, à 16:24)


Sony Vaio VPC-SB1C5E, i7-2620M, 8Go, GPU AMD 6470M avec triple boot W7, Ubuntu 10.10 et Arch...
Galère les nouveaux sony sous linux!!!! (switch AMD/Intel, touchpad, ethernet,....)

Hors ligne

#2 Le 11/03/2010, à 12:39

AnsuzPeorth

Re : [RESOLU] help pour 'script' sed et rename...

olsman037 a écrit :

Et en passant, si vous aviez une solution pour copier tout les fichiers du repertoire courant en les renommant automatiquement (genre rajouter.bak ou un truc comme ça), je suis preneur aussi.. j'ai cherché dans mv et cp et j'ai rien trouvé (il se peut que je ne sache pas chercher hmm )

cd /home/dossier
ls | xargs -I% cp % %_bak

Pour ton premier problème, peut être qu'en passant par une boucle pour traiter chaque fichier pourrait aider ?
genre:

for fichier in *
do
...
done

Pour ne pas matcher, par exemple faire un ls avec les fichiers sans bak à la fin de leur nom:

ls *[^bak]

Avec tout ça, tu devrait t'en sortir wink

Dernière modification par AnsuzPeorth (Le 11/03/2010, à 12:41)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#3 Le 11/03/2010, à 13:29

olsman037

Re : [RESOLU] help pour 'script' sed et rename...

Bon bah beaucoup de temps pour pas grand chose... je vais plutot me faire un repertoire dédié à la conversion de fichier, ca m'évitera de faire des commandes de 4 lignes pour choisir les 3 fichiers que je dois traiter, le bon vieux ctrl+c ctrl+v sera aussi rapide!!

Pour ne pas matcher j'ai utilisé la commande find avec !

find  \( -name '*.do' ! -name '*_unix.do' \) | xargs -I% cp % %_bak

ca me fait une sauvegarde des fichiers *.do mais pas ceux qui finissent pas _unix.do (en fait je ne voulais pas faire une sauvegarde de TOUT le repertoire... mais tu as répondu à ma question)

et idem pour les commandes sed (juste à remplacer cp blabla par sed blabla).. ca marche plutot pas mal et on peut utiliser les 'ou', 'et', 'pas' pour faire une meilleure recherche (-a pour 'et', -o pour 'ou', ! pour 'pas')

Merci pour le tuyau, j'ai fais des progrès grâce à toi!!!

Dernière modification par olsman037 (Le 11/03/2010, à 13:33)


Sony Vaio VPC-SB1C5E, i7-2620M, 8Go, GPU AMD 6470M avec triple boot W7, Ubuntu 10.10 et Arch...
Galère les nouveaux sony sous linux!!!! (switch AMD/Intel, touchpad, ethernet,....)

Hors ligne

#4 Le 11/03/2010, à 14:33

AnsuzPeorth

Re : [RESOLU] help pour 'script' sed et rename...

J'ai pas tout compris dans ta façon de faire....
Ce que tu veux, c'est simplement créer une copie d'un fichier 'nom.do' en 'nom_unix.do'(ce serait mieux nom.unix.do) en y modifiant les path dans le fichier en question ?
donc un truc du genre (il ne faut que des fichiers .do ou .unix.do dans le dossier):
on recup les fichiers sans extension unix.do, on modifie et envois vers nom_fichier.unix.do

cd /home/dossier
for fichier in *[^unix.do]
do
sed 's/..../../g' $fichier > ${fichier%.*}.unix.do
done

Pour l'autre sens:
on recup les fichiers avec extension unix.do, on modifie et envois vers nom_fichier.do

for fichier in *unix.do
do
sed 's/..../../g' $fichier > ${fichier%%.*}.do
done

Pas besoin de passer par les rename & co !
Il est possible de faire une copie.bak dans la boucle.
C'est pas ça ???

EDIT: J'oubliais, il faudra peut être passer un coup de dos2unix avant (remplacer les \r\n par \n), et unix2dos dans l'autre sens (ou utilise sed pour faire ça)
EDIT2: j'ai pas mieux regarder que ça, mais ta commande sed pourrait etre fait differement, tu fais 2 fois appel au pattern de recherche, alors qu'une seule fois devrait suffire (j'ai pas fait d'essais sur des fichiers, pas le goût smile)

sed '/pattern/{s/...//;s/..//}'

EDIT3: Mets ton code entre balises, ca sera plus lisible wink
EDIT4: (tin, j'en ai des chose à dire smile !)
pour ne pas utiliser les / comme séparateur dans sed (on sait qu'apres la commande s le signe suivant sera le séparateur), pour la forme sed '/pattern/...' on peut faire sed '\@pattern@s@...@@' ca evite les complications de lecture avec les antislash !

Dernière modification par AnsuzPeorth (Le 11/03/2010, à 15:09)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 12/03/2010, à 16:31

olsman037

Re : [RESOLU] help pour 'script' sed et rename...

Lol!! On dirait moi qui me prends la tête sur un truc pas grave, pour le plaisir de me prendre la tête!!!

Effectivement mon code est pas super... mais il marche..

Au départ, je voulais lancer la commande dans un dossier où il y avait des .do, mais aussi des .dta, des .tex, des .doc, etc... et mon côté perfectionniste aurait voulu que ça passe de l'un à l'autre de façon presque transparente... si possible en ne retransformant les fichiers .do plus récent que _unix.do qui ont le même nom... (et réciproquement...)
Je pense qu'avec find j'ai tous ce qu'il me faut pour le faire... mais un peu la flemme pour gagner 3 secondes dans mon traitement... (c'est un truc que je lance 1 ou 2 fois par jour MAXI)

Par contre merci pour le coup du sed envoyé dans un autre fichier.. Je pense que ça me servira...

Pour l'instant je crée un dossier .do,  je copie mes .do dedans, je mets ceux que je veux modifier dans un repertoire spéciale (dans mes signets) où il y a mes scripts, je les lance, je récupère les _unix.do, et je les mets dans mon dossier de .do...
C'est moche, mais c'est pas si long que ça!!! (beaucoup moins qu'utiliser gedit et rechercher/remplacer!!!)

du coup je vais surement faire comme tu as dis, sans faire de sauvegarde des fichiers dos...

Pour ce qui est des sauts de ligne il n'y a pas de problème apparemment...

Encore merci de te pencher sur mon problème (existentiel!!!)

Pour info j'ai ça maintenant :

find -maxdepth 1 \( -name '*.do' ! -name '*_unix.do' \) -print0 | xargs -0 rename 's/.do/.dos/g'
sed -i.do '/C:\\/s|\\|/|g;/C:\//s|C:/|/home/leo/|g' *.dos
rename 's/.dos.do/_dos.do/g' *.dos.do
rename 's/.dos/_unix.do/g' *.dos
sed -i.old '/\/home\/leo\//s|/|\\|g;/\\home\\leo\\/s|\\home\\leo\\|C:\\|g' *_unix.do
rm *_dos.do
cp -u *_unix.do 
rename 's/_unix.do/.do/g' *_unix.do
rename 's/_unix.do.old/_unix.do/g' *_unix.do.old

Je pense qu'il y a du ménage à faire.. mais ça fait ce dont j'ai besoin à défaut de faire ce que je veux... (finalement plus je connais de commande plus je me dis qu'on peut affiner... mais au bout d'un moment il faut passer au vrai boulot!!)


Sony Vaio VPC-SB1C5E, i7-2620M, 8Go, GPU AMD 6470M avec triple boot W7, Ubuntu 10.10 et Arch...
Galère les nouveaux sony sous linux!!!! (switch AMD/Intel, touchpad, ethernet,....)

Hors ligne