recursiveprint() {
#FILES_COUNT=0
cd $1
for d in *; do
if [ -d "$d" ]; then
(recursiveprint "$d")
fi
if [ -f "$d" ]; then
file_name=$(basename "$d")
((FILES_COUNT++))
clear
echo "$file_name"
echo "total count = $FILES_COUNT"
fi
done
}
recursiveprint ${START_DIR}
問題は、あるフォルダを繰り返すと、別のフォルダを繰り返す前に数が再びゼロに設定されることです。全体として、異なるフォルダに30個のファイルがあり、個数は6個になります。これは、繰り返される最後のフォルダのファイル数です。この問題を解決する方法に関する提案はありますか?
ベストアンサー1
if [ -d "$d" ]; then
(recursiveprint "$d")
fi
この行の周りの括弧は、(recursiveprint "$d")
サブシェルで関数を実行します。サブシェルが起動すると、値が複製FILES_COUNT
され、サブシェル内の再帰呼び出しで行われた変更は周囲の環境には適用されません。
サブシェルがない場合はうまく機能しますが、関数インスタンスから返すときは親ディレクトリに手動で戻る必要があります。cd ..
関数内の呼び出しに使用できますが、絶対パスで指定されていても元の作業ディレクトリに戻ることができるように変数を使用します。
recursiveprint() {
local oldpwd=$PWD
cd "$1"
...
if [ -d "$d" ]; then
recursiveprint "$d" # no parenthesis here
fi
...
cd "$oldpwd"
}
また、*
ドットで始まるファイル名はデフォルトで一致しないため、shopt -s dotglob
必要に応じてそれを使用してください。