2

次のコード スニペットのようなシェル スクリプトがあります。

...
export updates=0

processFiles() {
    updates=$((updates+1))
}

export -f processFiles
find $path -exec /bin/bash -c "processFiles '{}'" \;

echo $updates

使用法は、保持する更新、挿入、およびファイルの量をカウントすることです。残念ながら、最後のエコーは常に 0 を出力します。

関数でも export を使用しようとしましたが、機能しませんでした。

4

1 に答える 1

1

を使用する代わりにfind、検索基準が十分に単純であれば、bash を直接使用できます。例えば、

for file in *; do
    processFiles "$file"
done

processFiles各ファイルとディレクトリの名前を引数として、現在のディレクトリのすべてのファイルとディレクトリ (非表示のものを除く) に対して関数を実行します。すべてのファイル、ディレクトリ、およびサブディレクトリ (非表示のものを除く) に再帰的に適用する必要がある場合は、globstar シェル オプションを使用します。

#!/bin/bash

shopt -s globstar
shopt -s nullglob

updates=0

processFiles() {
    ((++updates))
}

for file in **; do
    processFiles "$file"
done

echo "$updates"

ファイルだけが必要で、ディレクトリが必要ない場合は、これを for ループに挿入します。

    [[ -f "$file" ]] || continue

fileがファイルでない場合 (つまり、ディレクトリなどの別のものである場合) は、ループを続行します。

変数 を展開して取得したディレクトリ内のファイルのみに一致させるにはpath、次のように for ループを記述します。

for file in "$path"/*; do

(または"$path"/**globstar を使用していて再帰が必要な場合)。

より複雑な検索条件が必要な場合は、いつでもextglobオプションを使用できます。隠しファイルも含める必要がある場合は、dotglobオプションを使用します。

bash の詳細については、リファレンス マニュアル、特に次のセクションを参照してください。

最後の注意: この 100% bash ソリューションが本当に気に入らず、OP のスクリプトに沿って何かを実行したい場合は、bash 変数を使用せずに (一時) ファイルを使用して、あるプロセスから別のプロセスに渡す必要がある値。これはかなりうまく機能する安価な IPC メソッドですが、安全に実装するのはより困難です。

于 2012-12-02T12:31:57.683 に答える