나는 이 기능을 가지고 있습니다 :
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
}
어딘가에서 실수를 했다면 알려주세요. 앞서 경고했듯이 아직 테스트되지 않았습니다.