Criando um loop for no meu script bash

0

Eu tenho um script bem simples. Eu só quero cd em vários diretórios que se parecem com isso:

cd PKA1/timestep_size/v_0.001/250eV
../ovitos silica_defects.py

Eu gostaria de percorrer PKA1 para PKA24 em incrementos de 1. Como posso fazer isso? Além disso, existe uma maneira de aplicar o silica_defects.py a cada diretório e fazer com que ele envie o arquivo para lá, em vez de copiar o silica_defects.py para cada subpasta (as subpastas 250eV).

    
por Jackson Hart 20.01.2017 / 18:47

3 respostas

2

É um trabalho para a expansão de chaves de bash , {START..END} :

PKA{1..24}

Então você pode fazer:

for f in PKA{1..24}/timestep_size/v_0.001/250eV/; do ...; done

E para o silica_defects.py , use o caminho absoluto para o arquivo.

    
por 20.01.2017 / 18:57
1

Vamos usar um loop for para gerar os números inteiros de 1 a 24, usar cd em um subshell para alterar o diretório para os subdiretórios e executar o script:

for (( i = 1; i <= 24; ++i )); do
  ( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done

Ao usar um subshell, você evita "alterar novamente" para um diretório antigo antes de usar cd para o próximo subdiretório. Com && , você também evita tentar executar o programa se o diretório, por algum motivo, não existir.

Obviamente, você também pode fazer

for i in {1..24}; do
  ( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done

... mas eu não gosto da sintaxe {start..end} por razões estéticas, e também não dá a você a oportunidade de ser mais flexível com o jeito que você quer fazer o loop (em outras situações).

    
por 20.01.2017 / 19:45
0

Qual é o problema:

for ((i=1;i<=24;i++)) ; do
    cd PKA${i}/timestep_size/v_0.001/250eV
    ../ovitos silica_defects.py
    cd $OLDPWD
done
    
por 20.01.2017 / 18:51

Tags