Organizando pastas

1

Eu tenho várias pastas ("amazon", "niger", "rhine", ...). Dentro de cada um deles eu tenho várias subpastas ("gfdl", "hadgem", "ipsl", ...). Cada subpasta é composta por 5 subpastas (por exemplo, em "amazon", a subpasta "gfdl" é composta por 5 subpasta 'amazon_gfdl', 'amazon_gfdl1', ..., 'amazon_gfdl5'); e as outras subpastas seguem a mesma estrutura (por exemplo, na subpasta "amazon" "ipsl" é composta por 5 subpastas 'amazon_ipsl', 'amazon_ipsl1', 'amazon_ipsl2', ... até 'amazon_ipsl5'.

Eu tenho uma quantidade enorme de pastas seguindo o mesmo quadro de organização. Portanto, minha pergunta é a seguinte:

Como posso organizar cada pasta e subpasta de tal forma que em cada subpasta ("gfdl", "hadgem", "ipsl", ...), 4 novos diretórios sejam criados ("1", "2" , "3", "4"); e depois que a pasta, e. "amazon_gfdl" (já presente em "gfdl") é copiado em cada um desses novos diretórios e finalmente que "amazon_gfdl1" é movido para o novo diretório "1", "amazon_gfdl2" é movido para o novo diretório "2", e assim em!

Atualmente estou usando o comando cp e movo dentro de cada subpasta, mas não é muito eficiente e talvez precise de uma vida extra para terminar essa tarefa assim! Portanto, qualquer ajuda ou sugestão será muito apreciada. Muito obrigado!

    
por steve 02.08.2015 / 14:36

2 respostas

1

Você pode executar este script, mas não faz nada além de repetir os comandos. Quando ele fizer o que você quer, substitua o dont=echo por dont= , ou seja, nada.

dont=echo
for dir in */*
do if ! [[ "$dir" =~ [1234]$ ]]
   then file=${dir/\//_}
        for i in 1 2 3 4
        do $dont mkdir $dir/$i
           $dont cp -r $dir/$file $dir/$i
           $dont mv $dir$i $dir/$i
        done
   fi
done
    
por meuh 02.08.2015 / 16:51
0

Você deve tentar escrever algo semelhante a isto:

for dir in */; do
  echo "Moving into $dir"
  cd "$dir"
  for subDir in */; do
    echo "Moving into $subDir"
    cd "$subDir"
    for num in 1 2 3 4; do
      echo "Moving $dir_$sudDir$num to $num"
      mv -vRi "$dir_$sudDir$num" "$num"
    done
  done
done

Eu não testei isso e não recomendo executá-lo até que você o tenha testado. Alguns mv flags não funcionarão no Mac OSX por causa da versão do bash que ele roda - mas deve funcionar no Ubuntu.

Mais uma vez - mexer com o código acima até que ele faça o que você quer - você pode querer olhar para loops bash para geral, ou possivelmente usando um comando find para executar um bloco de código similar em uma linha. / p>

Relacionados: Como renomeio um diretório via a linha de comando?

    
por bfosterscripps 02.08.2015 / 16:36