2012-07-17 265 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会为每个文件运行一个单独的进程。