2011-12-20 3 views
0

У меня есть каталог с именем tinkering, который имеет следующие подкаталоги:работающие скрипты в разных каталогах

saraswati\ and\ durga\ pooja 
64\ yogini\ pooja 
52\ guruwar\ ke\ tap\ se\ unemployment\ finish 
bajrang\ bali\ har\ lete\ ain\ devote\ dukh 
bhoot\ bhagane\ ke\ tareke 
bacho\ ko\ gussa\ ane\ ka\ karan 
durga\ pooja 
khatre\ ke\ nishan\ hanth\ mein 
saraswati\ and\ durga\ pooja 
seb\ chadhane\ se\ ma\ hinnamasta 
bhoot\ bhagane\ ke\ tareke 

Каждый из этих подкаталогов есть скрипт под названием script.sh.

Я написал сценарий на терминале:

cd ~/tinkering/; 
cd saraswati\ and\ durga\ pooja/; 
./script.sh;  
cd ..; 
cd 64\ yogini\ pooja/; 
./script.sh;cd ../; 
cd 52\ guruwar\ ke\ tap\ se\ unemployment\ finish/; 
./script.sh;cd ../; 
cd bajrang\ bali\ har\ lete\ ain\ devote\ dukh/; 
./script.sh;cd ../; 
cd bhoot\ bhagane\ ke\ tareke/; 
./script.sh;cd ..; 
cd bacho\ ko\ gussa\ ane\ ka\ karan/; 
./script.sh;cd ..; 
cd durga\ pooja/;./script.sh; 
cd ..; 
cd khatre\ ke\ nishan\ hanth\ mein/;./script.sh; 
cd ..;cd saraswati\ and\ durga\ pooja/; 
./script.sh;cd ..; 
cd seb\ chadhane\ se\ ma\ hinnamasta/; 
./script.sh;cd ..; 
cd bhoot\ bhagane\ ke\ tareke/; 
./script.sh;cd ..; 

Но этот сценарий не мог бежать. Цель была, а не идти в каждый подкаталог и набирать ./script.sh Я могу автоматизировать этот процесс. Какую ошибку я сделал в коде выше?

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

+3

Мы не знаем, что означает «не может работать». –

+0

Абсолютно. Я пошел с предположением, что ему не хватает shebang или нет исполняемого файла, но это может быть и не так. –

+0

Еще одна вещь в дизайне: все ли эти файлы 'script.sh' одинаковы, и это всего лишь вопрос, из какого каталога вы его запускаете, или они делают разные вещи? –

ответ

3
for subdir in */; do 
    cd "$subdir" 
    ./script.sh 
    cd .. 
done 
+1

Порядочный старт, но добавление нескольких символов может устранить необходимость в 'cd ..'. –

+1

@ IgnacioVazquez-Abrams: вы хотите сделать это как '(cd" $ subdir "; ./script.sh)'? –

+0

Да, заверните 'cd $ subdir; ./script' -part в скобках, чтобы подобрать его. Не нужно записывать «вне». – plundra

2

Как и другие указатели, «невозможно запустить» может означать несколько вещей. Например. если вы получите сообщение Permission denied, вы должны использовать chmod a+x script.sh, если вы хотите вызывать свой скрипт с помощью ./script.sh.

Если вы можете запускать свои скрипты с помощью /some path with whitespace/script.sh, вы можете поместить его в сценарий оболочки под ~/tinkering/.

find -name script.sh -mindepth 2 -maxdepth 2 -exec sh {} \; 
+0

@flesh нет, это не о разрешениях, скрипт в родительском каталоге не может изменять каталоги, о которых упоминается команда cd –

+0

спасибо, что я понял, что это новый подход +1 для этого. –

0

Сценарий должен быть исполнимым и иметь shebang.

Положите #!/bin/sh на начало и в эксплуатацию в терминале chmod +x myscript.sh (за все, что вы назвали своим скриптом).

Если вы пытаетесь выполнить все подкаталоги, вы также можете сделать это более эффективно с помощью цикла for (я вижу, что Roland предоставил ответ для этого, поэтому я опустил его).

+1

Если вы не передадите сценарий самому интерпретатору, например, 'bash somescript.sh'. –

+0

Правда, но с тем, что он говорит о запуске './Script.sh', я думаю, что, скорее всего, это не так. –

0

Я думаю, что это может сработать.

for d in */; do 
cp scr.sh "$d" 
chmod +x scr.sh 
done 

for subdir in */; do 
    cd "$subdir" 
    ./scr.sh 
    cd .. 
done 

for d in */; do rm scr.sh "$d"; done 
Смежные вопросы