2011-12-20 255 views
0

我有一個名爲tinkering目錄已以下子目錄:運行shell腳本

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我可以自動化這個過程。我在上面的代碼中犯了什麼錯誤?

編輯 請注意,我寫了一篇關於終端用分號隔開這些命令,而我在父目錄修修補補的所有子目錄有不同的腳本,做不同的工作,我想調用的所有shell腳本子目錄從終端上的父目錄。

+3

我們不知道「無法運行」是什麼意思。 – 2011-12-20 08:12:05

+0

絕對如此。我假設它缺少shebang或不可執行,但這可能不是它。 – 2011-12-20 08:17:07

+0

設計上的另一件事:所有這些'script.sh'文件是否都是相同的,這只是你從哪個目錄運行它的問題,還是它們做了不同的事情? – 2011-12-20 08:17:45

回答

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

一個體面的開始,但增加幾個字符可以消除'cd ..'的需要。 – 2011-12-20 08:14:52

+1

@ IgnacioVazquez-Abrams:你的意思是把它做成'(cd「$ subdir」; ./script.sh)'? – 2011-12-20 08:21:35

+0

是的,換行'cd $ subdir; ./script'-部分在括號中以便將其覆蓋。不需要cd「離開」。 – plundra 2011-12-20 08:21:47

2

像其他人一樣指出,「無法運行」可能意味着一些事情。例如。如果您收到消息Permission denied,則必須使用chmod a+x script.sh,前提是您要用./script.sh調用腳本。

如果您能夠使用/some path with whitespace/script.sh運行腳本,則可以將其放入~/tinkering/下的shell腳本中。

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

@flesh否它不是關於權限在父目錄中的腳本不能改變cd命令 – 2011-12-20 10:31:40

+0

提到的目錄謝謝我已經明白了這是一個新的方法+1。 – 2011-12-20 10:39:18

0

該腳本需要是可執行的並且有一個shebang。

#!/bin/sh放置在開始處並在終端chmod +x myscript.sh(適用於您所謂的腳本)運行。

如果您正在嘗試執行所有子目錄,您可以使用for循環更有效地執行此操作(我知道羅蘭爲此提供了答案,因此我將省略它)。

+1

除非您自己將腳本傳遞給解釋器,例如'bash somescript.sh'。 – 2011-12-20 08:17:28

+0

確實如此,但是他正在談論關於運行'。/ script.sh'的問題,我認爲他很可能不是。 – 2011-12-20 08:20:52

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