私はこの機能を持っています:
function vacatetmp () {
echo "Vacating TMP folder ${1}...."
for i in "$1"/*; do
if [ -f "$i" ]; then
caseit "$i"
elif [ -d "$i" ]; then
vacatetmp "$i"
fi
done
}
ターゲットフォルダ内のコンテンツが静的である場合は正常に動作します。つまり、関数が呼び出されてもファイルは変更されません。しかし、問題は、このコードの別の関数がとして参照され、ターゲットcaseit
フォルダに新しいファイルを追加して実際に追加することです。ターゲットフォルダのリストは"$1"/*
呼び出し時にリストされた配列なので、生成された新しいファイルは配列に追加されないため、関数内の再帰によって処理されません。誰もがこの問題を処理する方法を提案するのに役立ちますか?私はこの関数が関数によって追加された新しいファイルも処理したいと思います。for
caseit
vacatetmp
caseit
わかりやすくするために、caseit
関数は$i
渡されたファイルのMIMEタイプを見つけて、ターゲットvacatetmp
フォルダにファイルを抽出します"$1"
。アーカイブには複数のディレクトリ階層を含めることができるため、ファイルがどれだけ深く作成されるかを知ることはできません。再帰関数の理由。
答え1
まず、ファイルを繰り返し開き、ディレクトリを繰り返します。
for i in "$1/*"; do [[ -f "$i" ]] && caseit "$i"; done;
for i in "$1/*"; do [[ -d "$i" ]] && vacatetmp "$i"; done
最後に内部で電話する方がvacatetmp()
徹底します。caseit()
しかし、これが必須であるかどうか疑わしく保守するのが難しいコードになります。
答え2
ここにあなたのためのいくつかのアイデアがあります。しかし、まだテストされていません。
アイデアは、新しく解凍したファイルと各ソースファイルのディレクトリを独自の一時フォルダに分割することです。これは再帰的に繰り返され、再帰が深度で返されると、ファイルとディレクトリが正しい宛先に移動され、一時ディレクトリが削除されます。
function vacatetmp () {
echo "Vacating TMP folder ${1}...."
# You need a prefix for the new auxiliary temporary folders.
prefix=SomeGoodPrefix
for i in "$1"/*; do
if [ -f "$i" ]; then
# From your explanation:
# "Look up the mime type of "$i" and unzip the files into "$1"."
# Now, before you mix the new files and dirs with the old ones,
# unzip them to a special new directory with the prefix and the file name
# so that they're not mixed with the files and directories already present in "$1".
mkdir "$1"/"${prefix}""$i" &&
# How do you pass the target directory to "caseit"?
# However you do, pass it the temporary folder.
caseit "$i" "$1"/"${prefix}""$i" &&
# Now the new unzipped files and folders are in "$1"/"${prefix}""$i", so
# vacatetmp the auxiliary prefixed directory:
vacatetmp "$1"/"${prefix}""$i" &&
# and after you've finished with vacatetmp-ing that directory,
# move the contents of it to "$1".
mv "$1"/"${prefix}""$i"/* "$1" &&
# And finally remove the prefixed directory.
rmdir "$1"/"${prefix}""$1"
# This file is done. Recursively.
elif [ -d "$i" ]; then
vacatetmp "$i"
fi
done
}
どこかで間違えたら教えてください。先に警告したように、まだテストされていません。