2017-06-03 1 views
0

J'ai 100 scripts différents intitulés run_1.scr ... run_100.scr. Au sein de chaque script que j'ai une ligne qui dit:Incrémenter des copies d'un certain nom de script qui se trouve dans un autre script en utilisant bash

python screening_regression.py 

Je voudrais créer un code dans bash (ou de la ligne de commande) qui va changer le nom de screening_regression.py à screening_regression1.py pour run_1.scr et screening_regression2.py pour run_2.scr ... et screening_regression100.py pour run_100.scr. Je ne suis pas sûr s'il y a une commande facile qui me permettra juste de faire la boucle sur tous les fichiers qui sont run_1.scr ... run_100.scr et m'avez aller dans chaque dossier et incrémenter le nom de script de python que chaque manuscrit est appel. Des idées?

jusqu'à présent je ne dispose que d'un morceau de code qui passe en boucle sur les fichiers mais je ne suis pas sûr de savoir comment entrer dans chaque fichier et changer le nom du script python dans la façon dont je l'ai décrit:

#!/bin/bash 
#for filename in /Data/run_*.scr; do 
    #go into file and change screening_regression.py to screening_regression1.py 
    #for the first file and then screening_regression2.py for second file etc. 
#done 

#num=1 
for f in /home/mitche34/WIND_MOS/sub/run_screening_*.scr; do 
    #sed -i -e 's/(python screening_regression_1yr.py)/(python screening_regression_1yr$num.py)/g' "$f" 
    perl -i -lpe '($n)=$ARGV=~/\d+/g if $.==1\s/(python screening_regression_1yr)(.py)/$1$n$2/' "$f" 
    #num=num+1 
done 
+0

Qu'avez-vous fait jusqu'à maintenant? – 123

+0

Je n'ai pas beaucoup mais j'ai édité dessus avec ce que j'ai. – HM14

+0

C'est vraiment une mauvaise façon de le faire. Mieux vaut avoir un fichier qui ne contient que la variable potentiellement changeante, modifier uniquement ce fichier et demander à l'autre script de le lire. De cette façon, vous gardez vos scripts (écrits manuellement, ne changeant jamais) et vos fichiers de données (potentiellement mis à jour) séparés. –

Répondre

2

Vous peut utiliser et trouver perl avec inplace éditer comme si

find . -name "*.scr" -exec perl -i -lpe '($n)=$ARGV=~/\d+/g if $.==1\ 
s/(python screening_regression)(.py)/$1$n$2/' {} \; 

sur une ligne

find . -name "*.scr" -exec perl -i -lpe '($n)=$ARGV=~/\d+/g if $.==1;s/(python screening_regression)(.py)/$1$n$2/' {} \; 

Ou en utilisant votre boucle d'origine

#!/bin/bash 
for f in /Data/run_*.scr; do 

perl -i -lpe '($n)=$ARGV=~/\d+/g if $.==1\s/(python screening_regression)(.py)/$1$n$2/' "$f" 

done 
+0

Je n'ai jamais utilisé quelque chose comme ça avant, ça m'a l'air étranger. Est-ce que je l'utilise dans le script bash? – HM14

+0

Il suffit de l'exécuter à partir de la ligne de commande ou vous pouvez le mettre dans un script si vous voulez, donnez-moi une seconde, je vais écrire la même chose en utilisant votre boucle au lieu de trouver. – 123

+0

Cela semble bon. J'ai copié ceci dans mon script et j'ai une erreur: Backslash trouvé où l'opérateur attendait à -e ligne 1, près de "1 \" (opérateur manquant avant \?) erreur de syntaxe à -e ligne 1, près de "1 \" Exécution de -e annulée en raison d'erreurs de compilation. – HM14