Como mover muitas sub pastas diferentes um nível abaixo?

0

Eu tenho uma grande quantidade de arquivos na seguinte estrutura todos os arquivos em / base /, em seguida, 4 pastas com 2 letras "aleatórias" e, em seguida, uma série de arquivos relacionados entre si.

Exemplo:

/base/ab/12/13/37/file1.txt
/base/ab/12/13/37/file2.txt
/base/ab/12/13/37/file3.txt
/base/cd/b8/e2/a1/other1.txt
.... 
/base/cd/b8/e2/a1/other52.txt
/base/af/f3/45/9e/third1.txt
/base/af/f3/45/9e/third2.txt

etc

Eu quero manter a maior parte da estrutura, mas adicionar uma pasta ADICIONAL (pasta_pasta) no final, na qual meus arquivos pertencem. Tal que o acima é alterado para:

/base/ab/12/13/37/extra_folder/file1.txt
/base/ab/12/13/37/extra_folder/file2.txt
/base/ab/12/13/37/extra_folder/file3.txt
/base/cd/b8/e2/a1/extra_folder/other1.txt

Espero que eu precise de um shell script e do comando move.

Muito obrigado.

    
por Nixxon 11.10.2017 / 08:05

1 resposta

0

Começamos assim:

$ tree base/
base/
|-- ab
|   '-- 12
|       '-- 13
|           '-- 37
|               |-- file1.txt
|               |-- file2.txt
|               '-- file3.txt
|-- af
|   '-- f3
|       '-- 45
|           '-- 9e
|               |-- third1.txt
|               '-- third2.txt
'-- cd
    '-- b8
        '-- e2
            '-- a1
                |-- other1.txt
                '-- other52.txt

12 directories, 7 files

Primeiro, adicionamos os novos diretórios:

$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'

Usamos -mindepth 4 e -maxdepth 4 para criar novos diretórios apenas no nível quatro. Sem o -mindepth 4 , obteríamos novos diretórios em níveis mais altos, e sem -maxdepth 4 , os novos diretórios seriam preenchidos com novos diretórios até que os nomes dos caminhos ficassem tão longos que find não conseguisse mais criar.

O diretório extra_folder é criado com mkdir chamado de -exec . Agora temos

$ tree base/
base/
|-- ab
|   '-- 12
|       '-- 13
|           '-- 37
|               |-- extra_folder
|               |-- file1.txt
|               |-- file2.txt
|               '-- file3.txt
|-- af
|   '-- f3
|       '-- 45
|           '-- 9e
|               |-- extra_folder
|               |-- third1.txt
|               '-- third2.txt
'-- cd
    '-- b8
        '-- e2
            '-- a1
                |-- extra_folder
                |-- other1.txt
                '-- other52.txt

15 directories, 7 files

Depois, moveremos os arquivos para baixo:

$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'

Isso procura por qualquer arquivo regular dentro ou sob o diretório base (suponho que existam arquivos apenas no nível mais baixo) que estão no nível cinco. Em seguida, ele usa -execdir para executar o comando mv no diretório em que o arquivo encontrado está localizado ( {} será o nome base do arquivo encontrado).

Acabamos com

$ tree base/
base/
|-- ab
|   '-- 12
|       '-- 13
|           '-- 37
|               '-- extra_folder
|                   |-- file1.txt
|                   |-- file2.txt
|                   '-- file3.txt
|-- af
|   '-- f3
|       '-- 45
|           '-- 9e
|               '-- extra_folder
|                   |-- third1.txt
|                   '-- third2.txt
'-- cd
    '-- b8
        '-- e2
            '-- a1
                '-- extra_folder
                    |-- other1.txt
                    '-- other52.txt

15 directories, 7 files

De uma só vez:

$ find base -type f \
    -execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'

Isso localiza todos os arquivos regulares e os move para um diretório chamado extra_folder , independentemente de onde eles devem começar. A execução desse comando várias vezes os moverá mais e mais para baixo.

O mini-script que é chamado por -execdir :

[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"

Isso será chamado com o nome da pasta como $1 e com o nome do arquivo como $2 e criará a pasta se ela não existir e, em seguida, moverá o arquivo para ela.

    
por 11.10.2017 / 08:56