используя команды seq in bash - PullRequest
0 голосов
/ 24 марта 2020

У меня есть скрипт "epsmat_hdf5_merge.py", который объединяет содержимое нескольких файлов. Однако эти файлы находятся в отдельных папках, каждый из которых назван номером (0001 0002 ...). Я использую самый примитивный метод для идентификации файлов в папках:

epsmat_hdf5_merge.py q0001/eps0mat.h5 q0002/eps0mat.h5 q0003/eps0mat.h5 0004/eps0mat.h5 q0005/eps0mat.h5 q0006/eps0mat.h5 q0007/eps0mat.h5 q0008/eps0mat.h5 q0009/eps0mat.h5 q0010/eps0mat.h5

Обратите внимание, что здесь команда "epsmat_hdf5_merge.py", за которой следуют все файлы .h5 в соответствующих папках.

Я не могу использовать простой seq l oop, потому что

for i in seq`1 999`
do
epsmat_hdf5_merge.py q$i/eps0mat.h5

просто сделает следующее:

    epsmat_hdf5_merge.py q0001/eps0mat.h5
    epsmat_hdf5_merge.py q0002/eps0mat.h5
    epsmat_hdf5_merge.py q0003/eps0mat.h5
...

, то есть только один файл, за которым следует скрипт .py. Следовательно, сценарий объединения не может ничего объединить на любом этапе.

Есть идеи, как с этим справиться?

Примечание:

Кроме того, если мы изменим общее количество папок (999 ) теперь к переменной (var), как будет выглядеть синтаксис, учитывая, что расширение скобок имеет проблемы с управлением $ var?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Не уверен, но я думаю, что вы ищете

epsmat_hdf5_merge.py q{0001..0030}/eps0mat.h5

Вы должны настроить 0001 и 0030 на фактические номера, которые вас интересуют. Есть также варианты для пропущенных номеров или дополнительных. Пока работает расширение скобок, что не будет иметь место в старых bash версиях.

0 голосов
/ 24 марта 2020

Расширение скобок.

for i in q{0001..999}; do 
  echo epsmat_hdf5_merge.py $i/eps0mat.h5
done

Использование find для обработки в партии. bash4+ только

find q{0001..999}/ -type f -name '*.h5' -exec echo epsmat_hdf5_merge.py {} +

Если ваш bash ниже, чем bash4+ попытайтесь.

find q[0-9][0-9][0-9][0-9]/ -type f -name '*.h5' -exec echo epsmat_hdf5_merge.py {} +

Редактировать: Как указано в комментариях, variable существо используется в

{0001..999}  

до

{0001..$var}

Однако это не работает в bash, afaik Это работает только на zsh, потому что расширение фигурных скобок происходит раньше, чем расширение переменных.

Обходной путь - использовать стиль c для l oop.

var=999
array=()

for ((i = 1; i <= var; i++)); do
  printf -v num '%04d' "$i"
  array+=("q$num/")
done

find "${array[@]}" -type f -name '*.h5' -exec echo epsmat_hdf5_merge.py {} +
  • Удалите echo, если вам нравится, что выводится.
...