MV Sub-Directories um nível acima, mas não para root

1

Eu tenho várias pastas na estrutura a seguir que gostaria de classificar.

Por exemplo:

/root/sub1/aaaa/bbbb/cccc/dddd
/root/sub2/aaaa/bbbb/cccc/dddd
/root/sub3/aaaa/bbbb/cccc/dddd
/root/sub4/aaaa/bbbb/cccc/dddd

Estas são pastas aninhadas sem nada, exceto a próxima pasta.

Eu quero cortar o caminho para isso

/root/sub1/dddd
/root/sub2/dddd
/root/sub3/dddd
/root/sub4/dddd

Eu não quero mover as pastas para a pasta de nível raiz, mas apenas abaixo da pasta principal.

O melhor comando que consigo pensar é o seguinte:

mv sub*/aaaa/bbbb/cccc/dddd

No entanto, isso traria tudo para o nível raiz.

Ou eu poderia executar o comando dentro de cada subpasta, mas isso ainda seria entediante.

mv aaaa/bbbb/cccc/dddd

    
por user244463 01.08.2017 / 13:29

2 respostas

0

Como os arquivos precisam acabar em diretórios diferentes, você precisa executar mv várias vezes, pelo menos uma vez por diretório de destino. Você pode fazer isso executando mv em um loop .

for x in /root/*
do
  mv -i "$x"/*/*/*/* "$x"
done

O corpo do loop (o comando mv ) é executado para cada entrada no diretório /root , por sua vez. Em cada execução do corpo do loop, "$x" é substituído pelo caminho /root/subN . O comando mv -i "$x"/*/*/*/* "$x" move um arquivo como /root/sub1/aaaa/bbbb/cccc/dddd para o diretório /root/sub1 , ou seja, o arquivo é movido para /root/sub1/dddd .

Com a opção -i , mv perguntará se o arquivo de destino já existe, o que pode acontecer se, por exemplo, você tiver /root/sub1/aaa1/bbb/ccc/ddd e /root/sub1/aaa2/bbb/ccc/ddd .

    
por 09.08.2017 / 02:28
-1
find /root -maxdepth 6 -mindepth 6 -type d | awk -F \/ '{ print "mv "$0" "$1"/"$2"/"$3"/"$6 }' | sh

Use o comando find com ênfase especial nas profundidades máximas e mínimas do diretório, então pegue a listagem e analise através do awk para construir um comando mv que possamos executar com sh. Remova o "| sh" para testar antes de adicionar a execução.

    
por 01.08.2017 / 13:57