SCRIPT
Esta é a versão editada do meu script original. OP originalmente não forneceu informações completas sobre o formato de nomenclatura. Este script se adapta ao que OP mencionou nos comentários foi a nomenclatura correta do arquivo.
* Notas técnicas: *
Neste script separamos o nome do arquivo em 6 campos separados usando o awk, com sublinhado como delimitador de campo. Primeiros dois campos, $ 1 e $ 2 são considerados string de texto estático. Os campos 3,4,5 e 6 são o registro de data e hora em que os dados do OP foram amostrados, não a data de criação do arquivo no sistema de arquivos.
Variável COPYDIR contém o nome do novo diretório no qual os arquivos com o registro de data e hora atualizado serão enviados. Criamos esse diretório no diretório de trabalho atual com mkdir $COPYDIR
Variáveis TEXTSTRING e DATESTRING mantêm o texto estático e o timestamp respectivamente. Na saída de amostra abaixo, usei duas strings diferentes para provar que o script funcionará, independentemente do texto que os dois primeiros campos contêm.
NEWEPOCHTIME é uma variável que contém um novo timestamp calculado no formato unix epoch. NEWDATE é uma variável que armazena timestamp do formato unix epoch para YYYY-MM-DD HH: MM. NEWAPPEND é o timestamp real que será adicionado ao arquivo no formato YYYY_MM_DD_HHMM desejado do OP.
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat
copia o arquivo antigo para o diretório "converted_files" (em vez de mover, para evitar perda de dados) com o datastamp atualizado.
Aviso , o script funcionará enquanto o formato de nomenclatura for realmente seguido, ou seja, todos os arquivos realmente têm SomeText_123.Data_YYYY_MM_DD_HHMM.dat
format.
#!/usr/bin/env bash
#
# Author: Serg Kolo
# Description: this script takes timestamp within the filename
# (which may be different from file's actual creation date)
# converts that date and time to unix's epoch time
# adds 30 minutes to it and renames it
COPYDIR="converted_files"
mkdir $COPYDIR
for file in *.dat; do
TEXTSTRING=$(stat -c %n $file | awk -F'_' '{print $1"_"$2"_"}' )
DATESTRING=$( stat -c %n $file | awk -F'_' '{gsub(".dat",""); print $3"-"$4"-"$5" "$6}' )
NEWEPOCHTIME=$( expr $( date --date="$DATESTRING" +%s ) + 1800 )
NEWDATE=$(date --date=@"$NEWEPOCHTIME" +%F"_"%R)
NEWAPPEND=$(echo $NEWDATE | awk '{gsub("-","_");gsub(":","");print}')
cp $file "$COPYDIR"/"$TEXTSTRING""$NEWAPPEND".dat
done
SCRIPT EM AÇÃO
A demonstração abaixo é cópia direta do meu terminal. Observe que eu criei arquivos originais com duas strings diferentes nos dois primeiros campos. Portanto, este script deve funcionar não importa o que esteja no início do nome do arquivo, desde que haja apenas duas strings separadas por sublinhado
O script recebeu o nome notes-conversion
porque desenvolvi o script a partir das anotações que fiz enquanto trabalhava nessa questão.
Observe que os nomes de arquivos que têm a parte HHMM como 2345 (que é de 15 minutos antes da meia-noite) são atualizados para 0015, e a parte DD é atualizada para o dia seguinte. Formato de 24 horas preservado.
Além disso, como o loop for apenas procura por .dat
arquivos, evitamos renomear outros arquivos ou diretórios que possam estar no diretório de trabalho, evitando assim qualquer possível perda de dados. No exemplo abaixo, o diretório original contém 11 itens, dos quais 3 são *.txt
de arquivos para teste, portanto, só trabalhamos com 8% de arquivos.dat
. No diretório para onde os arquivos atualizados vão, vemos 8 arquivos, todos .dat
e nenhum outro arquivo. Os dados são seguros, o script faz o seu trabalho.
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
85 $ ls
FileName_123.Dat_2015_05_31_1245.dat Test.txt
FileName_123.Dat_2015_05_31_2345.dat YoloSwag_123.Dat_2015_05_31_1245.dat
FileName_Foo.Bar_2015_05_31_1245.dat YoloSwag_123.Dat_2015_05_31_2345.dat
FileName_Foo.Bar_2015_05_31_2345.dat YoloSwag_Foo.Bar_2015_05_31_1245.dat
File.txt YoloSwag_Foo.Bar_2015_05_31_2345.dat
Random.txt
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
86 $ ls | wc -l
11
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
87 $ notes-conversion
[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
88 $ ls converted_files/; ls converted_files/ | wc -l
FileName_123.Dat_2015_05_31_1315.dat YoloSwag_123.Dat_2015_05_31_1315.dat
FileName_123.Dat_2015_06_01_0015.dat YoloSwag_123.Dat_2015_06_01_0015.dat
FileName_Foo.Bar_2015_05_31_1315.dat YoloSwag_Foo.Bar_2015_05_31_1315.dat
FileName_Foo.Bar_2015_06_01_0015.dat YoloSwag_Foo.Bar_2015_06_01_0015.dat
8
[67 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
89 $
EXPLICAÇÃO (da postagem original)
*) Hoje aprendi que os sistemas Unix-Linux contam o tempo em Tempo da epoch , ou simplesmente colocam segundos.
*) o script pega cada nome de arquivo, extrai data, converte em epoch, adiciona 1800 segundos (que são exatamente 30 minutos) e salva o arquivo com um novo timestamp.
*) Este script aborda o que o OP queria - altere o timestamp no nome do arquivo, não atualize o tempo de criação do próprio arquivo
Ferramentas usadas: