如何遍历动态更改的文件列表 - 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"/*时列出的数组,因此创建的新文件不会添加到该数组中,因此不会被 function 中的递归处理。有人可以帮忙建议一种方法来处理这个问题吗?我希望这个函数也能处理函数添加的新文件。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
}

如果我在某个地方犯了错误,请告诉我。正如我之前警告过的,它还没有经过测试。

相关内容