2012-07-17 200 views
-1

大家好,我的腳本有一些問題。我讀過從腳本內改變當前目錄是一個問題。基本上我正在尋找一個單一的PHP文件與項目文件夾和其中的任何子文件夾。我想將目錄更改爲該文件夾所在的位置併爲其執行命令。到目前爲止沒有運氣。Bash腳本cd問題

function findPHP(){ 
declare -a FILES 
FILES=$(find ./ -name \*.php) 
for file in "${FILES[@]}" 
do 

DIR=`dirname file` 
(cd $DIR && doSomethingInThisDir &(...)) 

done 

任何幫助將不勝感激。

+3

與其他(相關)問題一樣;發生什麼事? – trojanfoe 2012-07-17 11:47:37

+0

請完整發布所有**相關的**錯誤消息,以改善您的問題。 – 2012-07-17 12:09:09

回答

3

您試圖迭代FILES作爲數組,但它只有一個元素。爲了使你的子shell的結果到一個數組,你可以:

FILES=($(find ./ -name \*.php)) 

注意,它分裂的空格的文件名,所以即使你正確地引用下面,它不會幫助。或者,你可以只讓它分裂下方(即使用現有的FILES),並使用來代替:

for file in $FILES 

如果您正在使用bash 4,你可能想看看遞歸的通配...這將使它簡單一點:

for file in **/*.php 

請注意,您必須有globstar外殼選項設置,您可以用shopt -s globstar啓用。這種方式更簡單,不會因空白而斷裂。

此外,你可能想$file這裏:

DIR=`dirname $file` 

或者只是使用參數擴展:

DIR=${file%/*} 
+0

+1有趣的答案!充滿了小寶石。 – trojanfoe 2012-07-17 12:13:57

1

沒有理由使用數組,或者文件列表存儲在反正。如果您的find支持-execdir(例如gnufi​​nd 4.2.27),則使用它。否則,在子shell CD,因爲你這樣做:

#!/bin/bash 
doSomethingInThisDir() (cd $(dirname $1); ...) 
export -f doSomethingInThisDir 
find . -type f -exec bash -c 'doSomethingInThisDir {}' \; 

我已經定義了使用()代替{}的功能,但是這是沒有必要在這種情況下。通常,使用()會導致該函數在子外殼中運行,但無論如何,這是因爲find會爲每個文件運行一個單獨的進程。