![Iterar sobre archivos con un rango de números creciente pero no contiguo en el nombre](https://rvso.com/image/192250/Iterar%20sobre%20archivos%20con%20un%20rango%20de%20n%C3%BAmeros%20creciente%20pero%20no%20contiguo%20en%20el%20nombre.png)
El nombre del archivo contiene un patrón de la forma 00035023030
que solo cambia de ...30
a ...35
en los dos últimos dígitos. Pero si se omite un número, 30
por 35
ejemplo 31
, se genera el error. ¿Cómo evitar este error y ejecutar la siguiente lista de comandos en bucle?
Aquí barycorr
está el programa que me pide tres entradas:
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/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 desdestart
hastaend
:$ echo {00035023030..00035023033} 00035023030 00035023031 00035023032 00035023033
Es for variable in something
un 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 comosw${num}xwtw2po_cl_bary.evt
porque consw$numxwtw2po_cl_bary.evt
el shell no tendría forma de saber si el nombre de la variable es$num
y no$numxwtw2po_cl_bary.evt
.if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
: estoif
simplemente verifica si existen los tres archivos. Está-e
comprobando la existencia del archivo. Por lo tanto,if
sólo tendrá éxito si los tres archivos están presentes.