![Перебрать файлы с увеличивающимся, но не непрерывным диапазоном номеров в имени](https://rvso.com/image/192250/%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20%D1%81%20%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B8%D0%B2%D0%B0%D1%8E%D1%89%D0%B8%D0%BC%D1%81%D1%8F%2C%20%D0%BD%D0%BE%20%D0%BD%D0%B5%20%D0%BD%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%BC%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%BE%D0%BC%20%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BE%D0%B2%20%D0%B2%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8.png)
Имя файла содержит шаблон формы 00035023030
, которая меняется только с ...30
на ...35
на последних двух цифрах. Но если пропущена одна цифра формы с на, например 30
, выдается ошибка. Как обойти эту ошибку и запустить приведенный ниже список команд в цикле?35
31
Вот barycorr
программа, которая запрашивает у меня три входных данных:
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz
Файл скрипта, который я создал для каждого запуска:
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
решение1
Ваш скрипт не остановится и выполнит все команды. Все, что вам нужно сделать, это проигнорировать ошибку. Однако вы действительно можете сделать так, чтобы он пропускал отсутствующие файлы. Например, вы можете переписать свой скрипт следующим образом (предполагая, что bash release 4 или более поздняя версия, для заполнения нулями в расширении скобок):
#!/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
Объяснение
for num in {00035023030..00035023033}; do
: эта{start..end}
нотация называется «расширением фигурных скобок» и будет распространяться на все числа отstart
доend
:$ echo {00035023030..00035023033} 00035023030 00035023031 00035023032 00035023033
Это for variable in something
цикл for, который установит значение переменной ( $num
в данном случае ) для каждого из "somethings". Это означает, что этот цикл будет перебирать числа от 00035023030 до 0035023033.
Внутри цикла мы просто настраиваем некоторые переменные, чтобы избежать необходимости писать очень длинные имена и сохранить все чистым. Итак, у нас есть:
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}
необходимо для того, чтобы оболочка могла понимать такие вещи, как ,sw${num}xwtw2po_cl_bary.evt
поскольку в противном случаеsw$numxwtw2po_cl_bary.evt
оболочка не имела бы возможности узнать, что имя переменной — ,$num
а не$numxwtw2po_cl_bary.evt
.if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
: этоif
просто проверяет, существуют ли все три файла.-e
Проверка существования файла. Так чтоif
будет успешно выполнена только в том случае, если присутствуют все три файла.