Iterar sobre arquivos com intervalo de números crescente, mas não contíguo, no nome

Iterar sobre arquivos com intervalo de números crescente, mas não contíguo, no nome

O nome do arquivo contém um padrão no formato 00035023030que muda apenas de ...30para ...35nos dois últimos dígitos. Mas se um número for perdido 30como 35say 31, isso gerará o erro. Como contornar esse erro e executar a lista de comandos abaixo em loop?

Aqui barycorrestá o programa que me pede três entradas:

  1. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
  2. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
  3. /home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz

O arquivo de script que criei para cada um executar:

echo -e "/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023030/auxil/sw00035023030sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl.evt
/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023031/auxil/sw00035023031sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023033/sw00035023033xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023033xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

Responder1

Seu script não irá parar e executará todos os comandos. Tudo que você precisa fazer é ignorar o erro. No entanto, você pode realmente fazer com que ele ignore os arquivos ausentes. Por exemplo, você poderia reescrever seu script assim (assumindo o bash versão 4 ou mais recente, para o preenchimento de zeros na expansão de chaves):

#!/bin/bash

for num in {00035023030..00035023033}; do
    dir=/home/dinesh/Test/output"${num}"
    file1="$dir/sw${num}xwtw2po_cl.evt"
    file2="$dir/sw${num}xwtw2po_cl_bary.evt"
    file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"

    if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
        printf '%s %s %s' "$file1" "$file2" "$file3" | 
            barycorr ra=253.467570 dec=39.760169 &>>log
    else
        echo "Some files missing for $num" >> log
    fi
done

Explicação

  • for num in {00035023030..00035023033}; do: a {start..end}notação é chamada de "expansão de chaves" e será expandida para todos os números de startaté end:

    $ echo {00035023030..00035023033}
    00035023030 00035023031 00035023032 00035023033
    

O for variable in somethingé um loop for e definirá o valor da variável ( $num, neste caso) para cada uma das "alguma coisa". Isso significa que esse loop irá iterar sobre os números de 00035023030 a 0035023033.

  • Dentro do loop, simplesmente configuramos algumas variáveis ​​para evitar a necessidade de escrever nomes muito longos e manter tudo limpo. Então nós temos:

     dir=/home/dinesh/Test/output"${num}"
     file1="$dir/sw${num}xwtw2po_cl.evt"
     file2="$dir/sw${num}xwtw2po_cl_bary.evt"
     file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"
    

    ${num}é necessário para que o shell possa entender coisas como sw${num}xwtw2po_cl_bary.evtporque com sw$numxwtw2po_cl_bary.evto shell não teria como saber que o nome da variável é $nume não $numxwtw2po_cl_bary.evt.

  • if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then: isso ifsimplesmente verifica se todos os três arquivos existem. O -eestá verificando a existência do arquivo. Portanto, o procedimento ifsó terá sucesso se todos os três arquivos estiverem presentes.

informação relacionada