동적으로 변경되는 파일 목록을 반복하는 방법 - Ubuntu bash

동적으로 변경되는 파일 목록을 반복하는 방법 - Ubuntu bash

나는 이 기능을 가지고 있습니다 :

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"/*호출 시 나열된 배열이므로 생성된 새 파일은 배열에 추가되지 않으므로 함수 내 재귀에 의해 처리되지 않습니다. 누구든지 이 문제를 처리하는 방법을 제안하는 데 도움을 줄 수 있습니까? 나는 이 함수가 함수에 의해 추가된 새 파일도 처리하기를 원합니다.forcaseitvacatetmpcaseit

명확성을 위해 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
}

어딘가에서 실수를 했다면 알려주세요. 앞서 경고했듯이 아직 테스트되지 않았습니다.

관련 정보