Mover muitas pastas e arquivos para suas muitas pastas pai

3

Eu preciso encontrar todas as pastas com o nome "test" e mover todas as pastas junto com os arquivos dentro de um nível para as pastas pai:

html/folder1/js/test -> html/folder1/test

html/folder2/js/test -> html/folder2/test

para mais de 500 pastas

    
por Paulo Rodrigues 18.07.2016 / 18:26

2 respostas

2

Você pode fazer isso com um loop for no diretório que é o pai de folder1 , folder2 etc (o diretório html em seu exemplo), portanto, primeiro cd (substitua pelo caminho real:

cd /PATH/TO/html

Nesse comando, se o nome do que você deseja mover não for test , substitua test pelo nome real ou use * para mover tudo:

for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done

Isso moverá todas as coisas nomeadas test (e todos os seus conteúdos, se forem diretórios) em subdiretórios do diretório de trabalho atual para seus diretórios-pais, mas não excluirá os subdiretórios em si (por isso, js no seu exemplo, não seria excluído)

Exemplo:

antes:

.
├── 15
│   └── rainbow
│       ├── test
│       └── fun

depois:

.
├── 15
│   ├── rainbow
│   └── test
│       └── fun

O comando lançará um erro para qualquer coisa que não seja um diretório com essa estrutura e conteúdo correspondente, mas ainda faz o que você quer, então, por favor, ignore isto ou envie os erros, anexando 2>/dev/null

for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done 2>/dev/null
    
por Zanna 18.07.2016 / 18:32
2
find folder* -name 'test' -exec mv {} {}/../.. \;

Explicação

find folder* Pesquisas em qualquer ./folder* ( padrões de glob expandidos por shell)

-name 'test' para arquivos com nome test .

-exec mv {} {}/../.. \; Move-os dois níveis acima 1 . {} é substituído pelo nome encontrado. A opção -exec deve ser terminada com um ponto e vírgula de escape. Você pode fazer uma execução seca adicionando echo antes de mv .

1 Por que dois níveis acima? Se movermos a pasta para sua pasta pai, pedimos para torná-la uma subpasta de seu superoldador atual, para que ela permaneça no local atual. No entanto, queremos movê-lo para se tornar uma subpasta do pai dos pais. Um comando expandido se parecerá com mv folder1/js/test folder1/js/test/../.. , que é expandido para mv folder1/js/test folder1 .

Nota

A execução deste comando emitirá avisos como:

find: ‘folder1/js/test’: No such file or directory

porque está tentando pesquisar na pasta depois , ela foi movida. Isso pode ser silenciado especificando 2> /dev/null .

    
por Melebius 19.07.2016 / 08:03