Como iterar através de uma lista de arquivos que muda dinamicamente - Ubuntu bash

5

Eu tenho a função:

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
}

Funciona bem se o conteúdo dentro da pasta de destino for estático - ou seja, nenhuma alteração nos arquivos enquanto a função é invocada. Mas o problema é que outra referência de função neste código como caseit , pode e adiciona novos arquivos à pasta de destino. Como a lista de pastas de destino "$1"/* é uma matriz listada quando for é invocado, os novos arquivos criados por caseit NÃO são incluídos nessa matriz e, portanto, não são atendidos pela recursão na função vacatetmp . Alguém pode ajudar sugerindo uma maneira de lidar com esse problema? Eu gostaria que essa função também cuidasse de novos arquivos adicionados pela função caseit .

Para maior clareza, a função caseit procura um tipo mime do arquivo $i passado a ele por vacatetmp e descompacta os arquivos na pasta de destino "$1" - já que os arquivos podem conter várias hierarquias de diretório nenhuma maneira de saber o quão profundo os arquivos serão criados, que é a razão para usar a função recursiva.

    
por sheikhness 22.02.2018 / 16:06

2 respostas

0

Aqui está uma ideia para você. Não foi testado embora.

A idéia é separar os arquivos e diretórios recém-descompactados de cada arquivo de origem em sua própria pasta temporária. Isso é recursivamente repetido e, quando a recursão volta das profundezas, os arquivos e diretórios são movidos para o destino correto e o diretório temporário é removido.

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
}

Deixe-me saber se eu tropecei em algum lugar. Não foi testado, como eu avisei antes.

    
por 22.02.2018 / 18:35
0

Primeiro, faça a iteração dos arquivos, abra-os e faça uma iteração pelos diretórios.

for i in "$1/*"; do [[ -f "$i" ]] && caseit "$i"; done; 
for i in "$1/*"; do [[ -d "$i" ]] && vacatetmp "$i"; done

Seria mais completo chamar também vacatetmp() de caseit() , no final. Mas duvido que isso seja necessário e leve a um código menos sustentável.

    
por 05.06.2018 / 01:36