Como mover todos os subdiretórios para o diretório atual?

1

Sou novo na programação de scripts de shell. Suponha que temos uma hierarquia de arquivos como esta:

/A/B/C/D
/A/B/E/F/G
/A/H/I
/A/H/J/K

Note que aqui não temos apenas /A/B/.. , mas também /A/H/... . Todas as letras são diretórios. Gostaríamos de transformar a hierarquia em:

/A/B/C
/A/B/D
/A/B/E
/A/B/F
/A/B/G
/A/H/I
/A/H/J
/A/H/K

Ou seja, mover todos os diretórios em uma profundidade maior que dois (dir A tem profundidade zero), para aprofundar dois. Eu posso usar JAVA e C para implementá-lo, mas eles são um pouco lentos demais. Alguém sabe como usar um script de shell para implementá-lo?

O pseudo-código é o seguinte:

for each directory D in current directory A // A may have more than one subdirectories
    for each directory d in D
        for each object in d
            if object is a directory
                move object and all descendant subdirectories of object to /A/D;
            end if
        end for
    end for
end for
    
por user3813057 18.03.2015 / 02:45

1 resposta

3
for dir in /A/*; do
    find "$dir" -mindepth 2 -depth -type d -exec mv -t "$dir" -- {} \;
done

Isso instrui find a procurar por todos os diretórios ( -type d ) pelo menos dois níveis abaixo ( -mindepth 2 ) $dir depth-first ( -depth ). Para cada objeto, ele encontra mv -t "$dir" -- <SRC> . Como sempre, mv não permite que você mescle um diretório de origem em um diretório de destino existente (mas há maneiras de contornar isso).

Você também pode evitar a execução de uma instância individual de mv para cada diretório de origem:

[...] -exec mv -t "$dir" -- {} +
    
por David Foerster 18.03.2015 / 02:58