-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、要素が1つしかありません。サブシェルの結果を配列にするために、次のことができます。

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%/*}
于 2012-07-17T12:04:58.927 に答える
1

とにかく、配列を使用したり、ファイルリストを保存したりする理由はありません。findサポートしている場合-execdir(gnufi​​nd 4.2.27 など)、それを使用してください。それ以外の場合は、以前と同じようにサブシェルで cd を実行します。

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

()の代わりに を使用して関数を定義しました{}が、この場合は必要ありません。通常、 using を使用()すると関数がサブシェルで実行されますが、 find はファイルごとに個別のプロセスを実行するため、ここではとにかく発生します。

于 2012-07-17T15:25:09.250 に答える