Последовательное изменение каталога и запуск скрипта

Для жизни я не могу найти никакой помощи в этом вообще. У меня есть, скажем, 2000 каталогов, в которых мне нужно запустить определенную программу. Из-за программных ограничений он не может просто написать «Output1», «Output2», «Output3» и т. Д. Он должен написать «Output» в качестве вывода файл и будет перезаписывать любой другой файл с именем «Выход», следовательно, требуется каталог для каждого уникального экземпляра программы. Что мне нужно, это что-то для этого

С s является префиксом для каталога. I. E., s0001, s0002 .... s2000 - это имена каталогов.

cd s(n)
ls
cd s(n+1)

и выполнение этой команды зацикливания прекращается после

cd s2000

. Я пытался заставить его работать с помощью строки

if 'cd s(n+1)' = 'cd s(2001)' then echo DONE

, но безрезультатно.

Любая помощь приветствуется.

3
задан 8 June 2015 в 16:25

4 ответа

Детали зависят от Вашей установки. Если родительский каталог только содержит дочерние каталоги s0001 к s2000, все, в чем Вы нуждаетесь, должен выполнить итерации по ним и запустить программу в каждом:

for d in s*; do
  cd "$dir" && run_program; cd ../;
done

, Который переместится в каждый dir и lauch run_program. Как только это закончено, это пятится.

, Если необходимо определить диапазон директоров, используйте это вместо этого:

for dir in s{0001..2000}; do
    cd "$dir" && run_program; cd ../
done

Наконец, если Вы хотите запустить все процессы одновременно (не, что это могло бы принести Ваш компьютер к его коленям), используйте &:

for dir in s{0001..2000}; do
    cd "$dir" && run_program & cd ../
done
<час>

Более старые версии удара не расширяются {001..002} как 001 002, но как 1 2 вместо этого. Если Ваш удар не поддерживает это, используйте этот подход вместо этого:

seq 1 2000 | while read i; do 
   dir=$(printf '%0.4d\n' "$i")
   cd s"$dir" && run_program; cd ../;
done

прием должен генерировать числа между 1 и 2000 с помощью seq и затем использовать printf для добавления продвижения 0s по мере необходимости.

0
ответ дан 8 June 2015 в 16:25

Вот сценарий удара. Не стесняйтесь адаптировать его для удовлетворения потребностям.

#!/bin/bash
#set -x
BASEDIR=/home/xieerqi

find "$BASEDIR" -type d -name "s[[:digit:]][[:digit:]][[:digit:]][[:digit:]]" -print0 | while IFS= read -r -d '' folder; do
        echo "$folder"
        cd "$folder"
        echo "TEST" | tee filez{1,2,3}
done
0
ответ дан 8 June 2015 в 16:25

можно попробовать этот сценарий

import os
def main():
    a = 100
    while a>1:
        os.chdir(os.path.expanduser("~/s000"+a))
        do your work here
        a = a-1
if __name__ == "__main__":
    main()

Python, где цикл с условием продолжения изменяется на каталог, пока это не равно 1. и можно изменить значение согласно желанию, и в "делают работу здесь", запишите то, что Вы хотите сделать.

0
ответ дан 8 June 2015 в 16:25

Программа всегда пишет Output, но Вы не должны оставлять ее тем путем. Если настройками программы управляют из командной строки, можно просто запустить программу и переименовать вывод, как только это заканчивается:

for dirname in `ls -d s*`
do
    myprogram "$dirname"
    mv Output Output-"$dirname"
done

, Конечно, я не знаю, какие аргументы параметра Ваша программа принимает, потому что Вы не говорите. Если это на самом деле читает из большого количества файлов, это делает, все еще имеют смысл иметь отдельные каталоги. Но "выходное имя фиксируется", не сам по себе никакая причина перейти ко всей этой проблеме.

пз. Не используйте круглые скобки в своих именах файлов. Они имеют особое значение к оболочке и путают Ваши сценарии, если Вы не знаете, как иметь дело с ними.

0
ответ дан 8 June 2015 в 16:25

Другие вопросы по тегам:

Похожие вопросы: