shell script para mover pastas e subpastas, converter o registro de data e hora em formato UTC e exportar o arquivo .csv

0

Eu tenho uma quantidade enorme de arquivos de imagem (cerca de 100 000) poupados em 50 pastas e subpastas e preciso escrever um script para tratar esses dados automaticamente

Estou tentando escrever um script de shell para uma tarefa um pouco complicada, e agora estou com dificuldades para executá-lo da maneira correta. Assim, para lhe dar a melhor descrição possível, vou anotar as principais coisas que quero fazer com este script da seguinte forma:

Primeiro: o script deve passar por Pastas e subpastas e extrair nomes de arquivos e caminho completo

Segundo: Os nomes dos arquivos contêm informações de hora e data .ie: 20180612074405680. Eu preciso do script para converter isso para o formato UTC .ie: 2018 - 06 - 12 T 07:44:05 TZ +01: 00

Finalmente: eu preciso que tudo isso seja exportado para um arquivo .csv,

O arquivo .csv final deve conter as seguintes informações:

File path, filename, time
C:/folder/sub-folder/file, 20180612074405680_ZTRDEFO_Blackgen.jpg, Time in UTC

O timestamp no nome do arquivo precisa ser formatado da maneira descrita acima!

Eu tenho tentado usar o comando find para acessar pastas e subpastas e obter nomes de arquivos, mas ainda não consegui obter o caminho completo dos arquivos

Alguém pode ajudar ou dar algumas dicas!

    
por WYA 20.06.2018 / 11:50

2 respostas

0

Rápido e sujo:

find "/full/path/of/the/base/dir" -type f -printf "%f;%h;%f\n" \
    | sed -r 's/;([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9][0-9])([^;]*)$/;--T::/ TZ +01:00'

Isso funciona se:

  1. Os carimbos de data / hora no nome do arquivo estão no fuso horário +01: 00,
  2. Nomes de arquivo e nomes de caminhos não contêm nenhum ';' personagem.
por 20.06.2018 / 14:00
0

Suposição: Você não quer converter entre fusos horários, apenas simplesmente analisar o timestamp no nome do arquivo como uma string. Além disso, os três últimos dígitos são insignificantes e podem ser descartados.

Usando find , chamando um script bash :

find . -type f -exec bash -c '
    pattern="([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})[0-9]{3}"
    fmt="\"%s\",\"%s\",%4d-%02d-%02dT%02d:%02d:%02d TZ +01:00\n"
    for pathname do
        ! [[ "${pathname##*/}" =~ $pattern ]] && continue
        printf "$fmt" "${pathname%/*}" "${pathname##*/}" "${BASH_REMATCH[@]:1}"
    done' bash {} + >report.csv

O comando find alimenta todos os arquivos encontrados no diretório atual ( . ) para um script bash curto. Se você quiser procurar um sufixo de nome de arquivo específico, adicione, e. -name '*.jpg' antes de -exec .

O script bash , com anotações:

# The regular expression that we'd like to match against each pathname.
pattern="([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})[0-9]{3}"
#        (year    )(month   )(day     )(hour    )(minute  )(second  ) last 3 digits ignored

# The format we'd like our output in (quoting the first two fields)
fmt="\"%s\",\"%s\",%4d-%02d-%02dT%02d:%02d:%02d TZ +01:00\n"

for pathname do
    # If we can't match the pattern against the filename, ignore this file
    ! [[ "${pathname##*/}" =~ $pattern ]] && continue

    # Output according to the format.
    printf "$fmt" "${pathname%/*}" "${pathname##*/}" "${BASH_REMATCH[@]:1}"
done

Ao produzir, ${pathname%/*} é o diretório do arquivo encontrado (pode ser escrito $( dirname "$pathname" ) ), ${pathname##*/} é o nome do arquivo encontrado (pode ser escrito $( basename "$pathname" ) ) e ${BASH_REMATCH[@]:1} será cada parte individual capturada pela expressão regular.

A saída do comando inteiro é gravada em report.csv usando um redirecionamento no final do comando find .

Exemplo:

.
'-- dir
    |-- 20180612074405680_ZTRDEFO_Blackgen.jpg
    |-- file20180612074405680-1.txt
    |-- file20180612074405680-10.txt
    |-- file20180612074405680-2.txt
    |-- file20180612074405680-3.txt
    |-- file20180612074405680-4.txt
    |-- file20180612074405680-5.txt
    |-- file20180612074405680-6.txt
    |-- file20180612074405680-7.txt
    |-- file20180612074405680-8.txt
    |-- file20180612074405680-9.txt
    '-- some-other-file

A execução do comando gera report.csv , o que parece

"./dir","file20180612074405680-1.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-2.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-3.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-4.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-5.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-6.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-7.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-8.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-9.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","file20180612074405680-10.txt",2018-06-12T07:44:05 TZ +01:00
"./dir","20180612074405680_ZTRDEFO_Blackgen.jpg",2018-06-12T07:44:05 TZ +01:00
    
por 23.06.2018 / 10:34