![Iterar sobre arquivos com intervalo de números crescente, mas não contíguo, no nome](https://rvso.com/image/192250/Iterar%20sobre%20arquivos%20com%20intervalo%20de%20n%C3%BAmeros%20crescente%2C%20mas%20n%C3%A3o%20cont%C3%ADguo%2C%20no%20nome.png)
O nome do arquivo contém um padrão no formato 00035023030
que muda apenas de ...30
para ...35
nos dois últimos dígitos. Mas se um número for perdido 30
como 35
say 31
, isso gerará o erro. Como contornar esse erro e executar a lista de comandos abaixo em loop?
Aqui barycorr
está o programa que me pede três entradas:
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/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 destart
até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 comosw${num}xwtw2po_cl_bary.evt
porque comsw$numxwtw2po_cl_bary.evt
o shell não teria como saber que o nome da variável é$num
e não$numxwtw2po_cl_bary.evt
.if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
: issoif
simplesmente verifica se todos os três arquivos existem. O-e
está verificando a existência do arquivo. Portanto, o procedimentoif
só terá sucesso se todos os três arquivos estiverem presentes.