-1

大家好,我的脚本有一些问题。我读过从脚本中更改当前目录有点问题。基本上我正在寻找一个带有项目文件夹和其中任何子文件夹的单个 php 文件。我想将目录更改为该文件夹所在的位置并为其执行命令。到目前为止还没有运气。

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

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

done

任何帮助将不胜感激。

4

2 回答 2

3

FILES您正在尝试作为数组进行迭代,但它只有一个元素。为了将您的子shell的结果变成一个数组,您可以:

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

请注意,它将文件名拆分为空格,因此即使您在下面正确引用,它也无济于事。或者,您可以让它在下面拆分(即使用您现有的FILES)并改用:

for file in $FILES

如果您正在使用bash 4,您可能想看看递归通配符......这会使它更容易一些:

for file in **/*.php

请注意,您必须globstar设置 shell 选项,您可以使用shopt -s globstar. 这种方式更简单,不会在空白处中断。

此外,您可能想要$file这里:

DIR=`dirname $file`

或者只是使用参数扩展:

DIR=${file%/*}
于 2012-07-17T12:04:58.927 回答
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 {}' \;

我已经使用()而不是定义了函数{},但在这种情况下这不是必需的。通常, using()会导致函数在子 shell 中运行,但无论如何都会发生这种情况,因为 find 为每个文件运行一个单独的进程。

于 2012-07-17T15:25:09.250 回答