Classifique e classifique os arquivos usando seus componentes de nome (unix)

1

Eu tenho uma pasta com milhares de arquivos respeitando o seguinte esquema de nomenclatura:

'institute_model_scenario_river.txt'

Cada componente dos nomes dos arquivos (instituto, modelo, cenário, rio) são variáveis.

Depois, gostaria de classificar e classificar esses arquivos pelo nome de cada variável exceto 'scenario' e 'river' .

Portanto, cada nome de instituto deve ser usado para criar um diretório correspondente. Esses diretórios devem ser compostos de subdiretórios nomeados de acordo com diferentes nomes de 'modelos'.

Para ser mais preciso, gostaria de fornecer um pequeno exemplo, considerando os seguintes arquivos:

wbm_gfdl_rcp4_mississippi.txt
matsiro_gfdl_rcp8_amazon.txt
wbm_miroc_rcp8_niger.txt

Gostaria de criar um diretório 'wbm' com os subdiretórios 'gfdl' (contendo o seguinte arquivo 'wbm_gfdl_rcp4_mississippi.txt' ) e 'miroc' (contendo o seguinte arquivo 'wbm_miroc_rcp8_niger.txt' ). E um diretório 'matsiro' tendo apenas um subdiretório 'gfdl' (contendo 'matsiro_gfdl_rcp8_amazon.txt' ).

Considerando a enorme quantidade de arquivos, eu realmente não sei por onde começar!

    
por steve 06.10.2015 / 16:18

1 resposta

1

No bash, você pode dividir o nome do arquivo em uma matriz:

#!/bin/bash
for file in *_*_*_*.txt ; do
    IFS=_ arr=($file)
    dir=${arr[0]}/${arr[1]}
    [[ -d $dir ]] || mkdir -p "$dir"
    cp "$file" "$dir"/
done

Se você quiser mover os arquivos em vez de copiá-los, use mv em vez de cp .

    
por choroba 06.10.2015 / 16:29