Перебрать файлы с увеличивающимся, но не непрерывным диапазоном номеров в имени

Перебрать файлы с увеличивающимся, но не непрерывным диапазоном номеров в имени

Имя файла содержит шаблон формы 00035023030, которая меняется только с ...30на ...35на последних двух цифрах. Но если пропущена одна цифра формы с на, например 30, выдается ошибка. Как обойти эту ошибку и запустить приведенный ниже список команд в цикле?3531

Вот barycorrпрограмма, которая запрашивает у меня три входных данных:

  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

Файл скрипта, который я создал для каждого запуска:

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будет успешно выполнена только в том случае, если присутствуют все три файла.

Связанный контент