Atribuindo variáveis ​​do texto no nome do arquivo

0

Estou tentando criar uma estrutura de diretórios com base nos caracteres no nome do arquivo (o nome do arquivo inclui datas e horas em que o arquivo começou a ser gravado). Estou pronto para descobrir como ler determinadas "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 imprimir com sucesso os valores que estou procurando. Mas não consigo atribuir esses valores como variáveis. Literalmente algo em torno das linhas de

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

Qualquer ajuda seria apreciada.

EDITAR:

Exemplo de nome de arquivo de origem - samplefilenames_2017-10-31_12-23-13.csv (todos os nomes de arquivos têm carimbos de data / hora nesse formato). A estrutura de diretórios que pretendo 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 e março .... (coluna 2) Em seguida, em cada um desses subdiretórios de cada um dos dias do mês (coluna 3) e depois em cada um deles, um para cada hora Naquele dia, coluna 4) Além disso, a coluna 8 no meu código é apenas do meu código, pois meus nomes de arquivos são realmente mais longos do que o meu exemplo. Estou ciente de que o valor precisa mudar de acordo.

TechSavvy
fonte
Você pode nos dar um exemplo do nome do arquivo de origem e da estrutura de diretórios correspondente que gostaria de ver?
Andy Dalton
Exemplo de nome de arquivo de origem - samplefilenames_2017-10-31_12-23-13.csv (todos os nomes de arquivos têm carimbos de data / hora nesse formato). A estrutura de diretórios que pretendo 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 e março .... (coluna 2) Em seguida, em cada um desses subdiretórios de cada um dos dias do mês (coluna 3) e depois em cada um deles, um para cada hora daquele dia, coluna 4).
TechSavvy

Respostas:

1

Tente algo como isto:

#!/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, analiso a data e a hora, transformamo-me em algo que o datecomando pode consumir, uso datepara produzir uma representação em cadeia da estrutura de diretórios que você está procurando, crio esse diretório e movo o arquivo para esse diretório.

O formato do diretório é:

year/month/date/hour

Se você não deseja que o ano seja incluído, você pode omitir %Y/o parâmetro no datecomando

Observe que eu não testei muito isso, YMMV.

Andy Dalton
fonte
Impressionante! Isso funcionou exatamente como foi escrito no meu diretório de teste e também funcionou perfeitamente na primeira tentativa, quando modificado para o meu uso no mundo real. Obrigado!
TechSavvy
1
(IFS=_-.; for f in *.csv; do set -- $f; echo $6; done)
jthill
fonte