Reestruturando diretórios em uma hierarquia

1

Eu tenho o seguinte tipo de estrutura de pastas que contém milhares de pastas.

Os nomes das pastas são assim com nomes diferentes, etc.

.test
.test.subfolder
.test.subfolder.subsubfolder

.folder
.folder.one
.folder.two
.folder.one.one

O que preciso alcançar é o seguinte: Eu quero que as pastas sejam renomeadas, por exemplo de .test a test e, em seguida, mova .test.subfolder para que a pasta .subfolder esteja na pasta test sem o . e, em seguida, .test.subfolder.subsubfolder , para que subfolder esteja na pasta test e subsubfolder estão dentro de test/subfolder .

Isso precisa ser recursivo, pois há muitas pastas. Lembre-se de que os arquivos contidos nas pastas ainda precisam estar intactos.

Isso é possível?

    
por Roland 09.10.2012 / 10:59

3 respostas

2

Este script bash faz o que você precisa:

#!/bin/bash
for dir in .*/ ; do
    [[ $dir == ./ || $dir == ../ ]] && continue  # Skip the special dirs
    new=${dir#.}                                 # Remove the dot at the beginning
    new=./${new//.//}                            # Replace dots with slashes, prepend ./
    new=${new%/}                                 # Remove the trainling slash
    mkdir -p ${new%/*}                           # Create the parent dir
    mv "$dir" "$new"                             # Move the dir to destination
done
    
por 09.10.2012 / 11:23
0

Sim, é bem possível. O que você precisa fazer é que você precisa ler todos os nomes de arquivo em seu caminho e considerar espaços, pontos e.t.c. Se você quiser fazer isso com eficiência, pode usar esse thread: Como executo uma ação em todos os arquivos com uma extensão específica em subpastas de uma maneira elegante?

Agora, depois de ler os arquivos no nome do caminho, você precisa estabelecer uma regra.

Por exemplo, vamos considerar essa estrutura:

 .test
  .test.subfolder
   .test.subfolder.subsubfolder

O que você precisa fazer é contar a ocorrência da palavra sub em cada um dos nomes dos arquivos. Portanto, se a contagem for: 0, é a pasta pai, se contar: 1, é um filho de 1º nível, se contar: 3 - > é uma criança de 2º nível e assim por diante (o nível é deduzido da estrutura fornecida por você)

Assim, um possível pseudo-código será parecido com:

  if(filename contains(".test"))
  {
   searchCount("sub");
   if(count ==0)
   parent();
   else if(count ==1)
   1stLevelChild();//and so on
  }

Agora, de acordo com o resultado que você está chegando aqui, você só precisa usar o comando Mover para mover os arquivos em pastas apropriadas.

    
por 09.10.2012 / 11:16
0

Isso é muito fácil em zsh, graças a zmv . Como o curinga .* expande os nomes de arquivo em ordem lexicográfica, um diretório para ser pai sempre será renomeado antes de seus filhos, portanto, por exemplo, test já existirá quando .test.subfolder for renomeado.

zmv '.(*)' "${1//./\/}"
    
por 10.10.2012 / 01:31