Infelizmente, não tenho tempo para lhe dar uma resposta completa, mas apenas algumas dicas que podem ajudar.
Eu iria apenas imprimir os arquivos relevantes e classificá-los de acordo com o tempo do Unix (descobri que funciona melhor do que o normal / tempo legível por humanos):
find $PWD -type f -printf '%T@ %p\n' | sort -nb
então você pode armazenar o tempo Unix do primeiro membro de um grupo de 30 min como ponto de referência para quando os 30 minutos começarem, calcular a diferença para o timestamp Unix do arquivo atual se > 1800 então crie um novo grupo else add to current group. Algo nesse sentido:
#!/bin/bash
#1800 s = 30 min
#unix time 86400s = 1 day
fileList=$(find $PWD -type f -printf '%T@ %p\n' | sort -nb)
## for debugging:
# fileList=$(find $PWD -type f -printf '%T@ %t %p\n' | sort -nb)
org_IFS=$IFS
IFS=$'\n'
group_start_time=0
for line in $fileList; do
current_time=$(echo $line | awk '{print $1}')
if [ $group_start_time -eq 0 ] ; then
group_start_time=$current_time
else
delta=$(($current_time - $group_start_time))
#echo $delta
if [ $delta -lt 1801 ] ; then
echo $line
else
echo -e "\nnew group:\n$line"
group_start_time=$current_time
fi
fi
done
IFS=$org_IFS
de lá você pode apenas fazer um redirecionamento do caminho do arquivo para qualquer arquivo que você quiser (usando > >). e depois execute mv
nessa lista de arquivos para seus respectivos diretórios.
Espero que ajude de alguma forma. :)
Editar: modifiquei o script de modo que ele grava os grupos de arquivos log.gz nos arquivos na origem (seu /opt/rename/
) no diretório de destino (que eu supus era seu diretório /opt/send/combined/
). Abaixo está o código modificado:
#!/bin/bash
#1800 s = 30 min
#unix time 86400s = 1 day
sourceFolder="/opt/rename/"
target="/opt/send/combined/"
path_to_file=$target
current_file="ORACLE_gprtcp_000.log.gz"
fileList=$(find $sourceFolder -type f -name '*.log.gz' -printf '%T@ %p\n' | sort -nb)
## for debugging:
# fileList=$(find $PWD -type f -printf '%T@ %t %p\n' | sort -nb)
echo ${fileList[0]}
org_IFS=$IFS
IFS=$'\n'
group_start_time=0
for line in $fileList; do
current_time=$(echo $line | awk '{print $1}')
if [ $group_start_time -eq 0 ] ; then
group_start_time=$current_time
hr_time=$( date -d @$current_time +%F_%0k%0M )
current_file="ORACLE_gprtcp_"$hr_time".log.gz"
else
delta=$(($current_time - $group_start_time))
#echo $delta
if [ $delta -lt 1801 ] ; then
# just append file path to current_file
echo $line | awk '{print $2}' >> $path_to_file"/"$current_file
echo $line
else
# construct new filename based on time of the first member of the group
hr_time=$( date -d @$current_time +%F_%0k%0M )
current_file="ORACLE_gprtcp_"$hr_time".log.gz"
# create file, append file path to current_file
echo $line | awk '{print $2}' >> $path_to_file"/"$current_file
echo -e "\nnew group:\n$line"
group_start_time=$current_time
fi
fi
done
IFS=$org_IFS