bash script - planifica a estrutura de diretórios

0

Estou procurando um script de shell que alise uma determinada estrutura de diretórios, mas SOMENTE se houver apenas uma subpasta nesse diretório. Por exemplo: o script iria achatar esta pasta:

/folder
    /subfolder
        file1
        file2

para:

/folder
    file1
    file2

mas pula (não faz nada) esta pasta

/folder
    /subfolder1
    /subfolder2 

Muito obrigado antecipadamente.

Steve

    
por Steven D 22.06.2018 / 14:48

1 resposta

1

Uma abordagem um tanto ingênua:

#!/bin/sh

for dir do

    # get list of directories under the directory $dir
    set -- "$dir"/*/

    # if there are more than one, continue with the next directory
    # also continue if we didn't match anything useful
    if [ "$#" -gt 1 ] || [ ! -d "$1" ]; then
        continue
    fi

    # the pathname of the subdirectory is now in $1

    # move everything from beneath the subdirectory to $dir
    # (this will skip hidden files)
    mv "$1"/* "$dir"

    # remove the subdirectory
    # (this will fail if there were hidden files)
    rmdir "$1"

done

Usando bash :

#!/bin/bash

for dir do

    # get list of directories under the directory $dir
    subdirs=( "$dir"/*/ )

    # if there are more than one, continue with the next directory
    # also continue if we didn't match anything useful
    if [ "${#subdirs[@]}" -gt 1 ] || [ ! -d "${subdirs[0]}" ]; then
        continue
    fi

    # the pathname of the subdirectory is now in ${subdirs[0]}

    # move everything from beneath the subdirectory to $dir
    # (this will skip hidden files)
    mv "{subdirs[0]}"/* "$dir"

    # remove the subdirectory
    # (this will fail if there were hidden files)
    rmdir "${subdirs[0]}"

done

Ambos os scripts seriam executados como

$ ./script.sh dir1 dir2 dir3

ou

$ ./script.sh */

para executá-lo em todos os diretórios no diretório atual.

Além das ressalvas no código, isso também deixaria de vincular os links simbólicos. Para fazer isso, você teria que percorrer todos os locais possíveis no sistema de arquivos e procurar por links apontando para o subdiretório em /folder e recriá-los para que apontem para o novo local correto. Eu não vou escrever o código tão longe aqui.

Além disso, nenhuma verificação é feita ao mover as coisas para fora do subdiretório para garantir que não haja entradas com os mesmos nomes já existentes em /folder .

    
por 22.06.2018 / 15:01