Рейтинг:0

скрипт bash для перебора папок и файлов

флаг ps

У меня есть папки с именами от ouput00035023031 до output000035023035.Я написал сценарий bash для перебора каждой папки и входа в папку. После входа в папку хочу запустить программу 'barycorr'. Который запрашивает три входа. Входные данные - это имена файлов *cl.evt. Код взорван:

для i в $(seq -f "%03g" 1 5); делать
    cd output0003502303$i
    эхо -е "sw00092413002xpcw3po_cl.evt 
    sw00092413002xpcw3po_cl_bary4.evt 
    sw00092413002sao.fits.gz" | barycorr ra=253.467570 dec=39.760169
    CD ..
сделано

Мне нужно сначала ввести имена файлов sw*pcw3po_cl.evt, во-вторых, имя файла, которое я хочу сохранить, например sw*xpcw3po_cl_bary4.evt и третий путь, где sw*sao.fits.gz файл находится. * меняется в зависимости от того, в какой папке я нахожусь. Как теперь написать скрипт для запуска этой программы внутри каждой папки.

флаг au
Всегда ли будет ровно одно совпадение с каждым из этих шаблонов в каждой папке? То есть возможно ли, что папка может иметь `sw1pcw3po_cl.evt`, а также `sw2pcw3po_cl.evt`?
unicorn avatar
флаг ps
Да, файл `sw00035023032xpcw3po_cl.evt` меняется в соответствии с номером выходной папки, например output00035023032, и, помимо этого, имя файла может быть `sw00035023032xwtw2po_cl.evt`, то есть pcw3 может быть изменено на 'wtw2'.
флаг au
Всегда ли первая часть совпадает с именем папки? То есть файлы `xpcw3po_cl.evt`, `xpcw3po_cl_bary4.evt` и `sao.fits.gz`? Кроме того, действительно ли необходимо `cd` в папки, или это сработает для передачи путей (например, `/xpcw3po_cl.evt`) в команду `barycorr`? (Причина второго вопроса в том, что `cd` в сценариях имеет тенденцию сбивать с толку и может вызвать сбои в виде цепной реакции, поэтому я предпочитаю их избегать.)
unicorn avatar
флаг ps
Да, мы можем указать путь. Мы можем составить список этой команды, изменив только числовое значение, например «00035023030» на «00035023035». : `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 ` . но если пропущено одно число, например ..31, то программа выдает ошибку. Мне нужно обойти ошибку тоже.
Рейтинг:0
флаг au

Если я правильно понял, вы должны сделать что-то вроде этого:

для i в $(seq -f "%03g" 1 5); делать
    printf '%s\n' "output0003502303${i}/sw00092413${i}"{xpcw3po_cl.evt,xpcw3po_cl_bary4.evt,sao.fits.gz} |
        барикорр ra=253,467570 dec=39,760169
сделано

Объяснение: printf '%s\n' напечатает каждый из следующих аргументов ( %s часть), за которой следуют символы новой строки ( \n) -- то есть каждый на отдельной строке. printf гораздо более контролируемым для таких вещей, чем эхо.

Что касается этих аргументов, каждый из них состоит из префиксов имени папки и имени файла, а затем {xpcw3po_cl.evt, xpcw3po_cl_bary4.evt, sao.fits.gz} часть расширяется до каждого из этих суффиксов. По сути, это сокращение от:

"output0003502303${i}/sw00092413${i}"xpcw3po_cl.evt
"output0003502303${i}/sw00092413${i}"xpcw3po_cl_bary4.evt
"output0003502303${i}/sw00092413${i}" sao.fits.gz

Это то, что нужно? Если нет, уточните.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.