Iterar sobre archivos con un rango de números creciente pero no contiguo en el nombre

Iterar sobre archivos con un rango de números creciente pero no contiguo en el nombre

El nombre del archivo contiene un patrón de la forma 00035023030que solo cambia de ...30a ...35en los dos últimos dígitos. Pero si se omite un número, 30por 35ejemplo 31, se genera el error. ¿Cómo evitar este error y ejecutar la siguiente lista de comandos en bucle?

Aquí barycorrestá el programa que me pide tres 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

El archivo de script que he creado para que se ejecute cada uno:

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

Respuesta1

Su secuencia de comandos no se detendrá y ejecutará todos los comandos. Todo lo que necesitas hacer es ignorar el error. Sin embargo, puedes hacerlo de modo que omita los archivos faltantes. Por ejemplo, podría reescribir su script de esta manera (suponiendo que bash tenga la versión 4 o posterior, para el relleno con ceros en la expansión de llaves):

#!/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

Explicación

  • for num in {00035023030..00035023033}; do: la {start..end}notación se llama "expansión de llaves" y se expandirá a todos los números desde starthasta end:

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

Es for variable in somethingun bucle for y establecerá el valor de la variable ( $num, en este caso) para cada uno de los "algo". Esto significa que este bucle iterará sobre los números del 00035023030 al 0035023033.

  • Dentro del bucle, simplemente configuramos algunas variables para evitar la necesidad de escribir nombres muy largos y mantener todo limpio. Entonces tenemos:

     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}es necesario para que el shell pueda entender cosas como sw${num}xwtw2po_cl_bary.evtporque con sw$numxwtw2po_cl_bary.evtel shell no tendría forma de saber si el nombre de la variable es $numy no $numxwtw2po_cl_bary.evt.

  • if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then: esto ifsimplemente verifica si existen los tres archivos. Está -ecomprobando la existencia del archivo. Por lo tanto, ifsólo tendrá éxito si los tres archivos están presentes.

información relacionada