Atribuindo variáveis do texto no nome do arquivo

0

Estou tentando criar uma estrutura de diretórios baseada em caracteres no nome do arquivo (o nome do arquivo inclui datas e horas em que o arquivo começou a ser gravado). Eu estou no ponto de ter descoberto como ler certas "colunas" no meu nome de arquivo e imprimi-las. Mas agora não consigo descobrir como armazená-los como números inteiros. Aqui está o meu código que estou tentando adicionar:

#!/bin/bash
FILES=samplefilenames*
for file in ${FILES}; do
    echo "${file}" | awk -F'[-_]' '{print $8}'
done
exit $ERRORS

Meus nomes de arquivos têm '-' e '_' neles, daí os delimitadores. Eu posso fazer isso com sucesso imprimir os valores que estou procurando. Mas não consigo atribuir esses valores como variáveis. Literalmente algo ao redor das linhas de

tempNum=echo "${file}" | awk -F'[-_]' '{print $8}'

Qualquer ajuda seria apreciada.

EDITAR:

Exemplo de nome de arquivo fonte - samplefilenames_2017-10-31_12-23-13.csv (todos os nomes de arquivos possuem carimbos de data / hora neles neste formato). A estrutura de diretórios que estou procurando fazer é adicionar código ao arquivo existente que os coloca aqui e, em vez de ter centenas de arquivos em um local, quero organizá-los em diretórios por data. Neste primeiro nível, pastas de janeiro, fevereiro, março .... (coluna 2) Então dentro de cada um deles, subdiretórios de cada um dos dias do mês (coluna 3), então dentro de cada um deles, um para cada hora dessa coluna dia 4) Além disso, a coluna 8 do meu código é apenas do meu código, uma vez que meus nomes de arquivos são realmente mais longos do que o meu exemplo. Estou ciente de que o valor precisa mudar de acordo.

    
por TechSavvy 31.10.2017 / 18:36

2 respostas

1

Tente algo assim:

#!/bin/bash
for filename in *.csv; do
    dateTime=($(basename "${filename}" .csv | awk -F_ '{ print $2, $3 }'))
    date="${dateTime[0]}"
    time="$(echo "${dateTime[1]}" | sed -e 's/-/:/g')"

    dir="$(date -d "${date} ${time}" +"%Y/%B/%d/%H")"

    mkdir -p "${dir}"
    mv "${filename}" "${dir}"
done

Basicamente, eu analiso a data e a hora, me transformo em algo que o O comando date pode consumir, use date para produzir uma representação de string da estrutura de diretórios que você está procurando, criar esse diretório e mover o arquivo para esse diretório.

O formato do diretório é:

year/month/date/hour

Se você não quiser incluir o ano, omite o %Y/ no parâmetro para o comando date .

Por favor, note que eu não testei muito isso, YMMV.

    
por 31.10.2017 / 19:08
1
(IFS=_-.; for f in *.csv; do set -- $f; echo $6; done)
    
por 31.10.2017 / 18:48