Linux: Mover arquivos da pasta desconhecida para pai desconhecido da mesma pasta desconhecida

0

Conseguiu sua atenção com esse título, não foi? LOL.

Problema: eu tenho muitas pastas com uma pasta dentro delas, com arquivos dentro. Eu quero mover os arquivos de 2º nível para o 1º nível e fazê-lo sem saber seus nomes.

Graficamente, aqui está o que eu quero:

Atual:

new
└── temp
    ├── Folder1
    │   ├── SubFolder1
    │   │   └── SubTest1.txt
    │   └── Test1.txt
    ├── Folder2
    │   ├── SubFolder2
    │   │   └── SubTest2.txt
    │   └── Test2.txt
    └── Folder3
        ├── SubFolder3
        │   └── SubTest3.txt
        └── Test3.txt

Desejado:

└── temp
    ├── Folder1
    │   ├── SubFolder1
    │   ├── SubTest1.txt
    │   └── Test1.txt
    ├── Folder2
    │   ├── SubFolder2
    │   ├── SubTest2.txt
    │   └── Test2.txt
    └── Folder3
        ├── SubFolder3
        ├── SubTest3.txt
        └── Test3.txt

Se alguém quisesse ficar chique, o que eu não preciso fazer mais tarde no meu script, eu removo os arquivos vazios, mas vale a pena mencionar apenas no caso de eu aprender ainda mais:

└── temp
    ├── Folder1
    │   ├── SubTest1.txt
    │   └── Test1.txt
    ├── Folder2
    │   ├── SubTest2.txt
    │   └── Test2.txt
    └── Folder3
        ├── SubTest3.txt
        └── Test3.txt

Estou ficando muito perto, mas estou sentindo falta de algo e tenho certeza de que é simples / estúpido. Aqui está o que estou executando:

 find . -mindepth 3 -type f -exec sh -c 'mv -i "$1" "${1%/*}"' sh {} \;

Veja o que está me ajudando:

mv: './1stlevel/2ndlevel/test.rtf' and './1stlevel/2ndlevel/test.rtf' are the same file

Em Estouro de pilha , George me aproximou de mim:

find . -mindepth 4 -type f -exec mv {} ./*/* \; 

e também:

mv ./*/*/*/* ./*/*

O comando mv é o caminho certo, pois é mais limpo e muito mais rápido. Mas, infelizmente, embora funcione bem com uma pasta, várias pastas tornam isso:

new
└── temp
    └── Folder3
        ├── Folder1
        │   ├── SubFolder1
        │   └── Test1.txt
        ├── Folder2
        │   ├── SubFolder2
        │   └── Test2.txt
        ├── SubFolder3
        ├── SubTest1.txt
        ├── SubTest2.txt
        ├── SubTest3.txt
        └── Test3.txt

Então, estou chegando perto, mas não exatamente lá. Alguma sugestão? Obrigado antecipadamente!

    
por Peter 23.04.2018 / 00:13

1 resposta

1

Você poderia usar um loop for para simplificar isso. Eu usei o dirname $ tiem / .. para obter um nível acima e o mindepth para limitar o efeito a um nível.

localhost$ tree
.
└── temp
    ├── folder1
    │   ├── subfolder1
    │   │   └── file1
    │   └── test1.txt
    ├── folder2
    │   ├── subfolder2
    │   │   └── file2
    │   └── test2.txt
    └── folder3
        ├── subfolder3
        │   └── file3
        └── test3.txt

7 directories, 6 files
/tmp/foo/new

localhost$ for item in 'find . -mindepth 4 -type f'; do echo $item 'dirname $item'/..; done
./temp/folder1/subfolder1/file1 ./temp/folder1/subfolder1/..
./temp/folder3/subfolder3/file3 ./temp/folder3/subfolder3/..
./temp/folder2/subfolder2/file2 ./temp/folder2/subfolder2/..

Após a mudança, torna-se

localhost$ for item in 'find . -mindepth 4 -type f'; do mv $item 'dirname $item'/..; done
/tmp/foo/new
localhost$ tree
.
└── temp
    ├── folder1
    │   ├── file1
    │   ├── subfolder1
    │   └── test1.txt
    ├── folder2
    │   ├── file2
    │   ├── subfolder2
    │   └── test2.txt
    └── folder3
        ├── file3
        ├── subfolder3
        └── test3.txt

7 directories, 6 files
/tmp/foo/new

localhost$

Espero que ajude.

    
por 23.04.2018 / 01:22

Tags