Usando o GNU date
, você pode percorrer facilmente uma variedade de datas no formato YYYYMMDD:
#!/usr/bin/bash
first=$1
last=$2
while [[ $first -le $last ]]; do
match=$(date +%Y%m%d -d $first)
echo "filename_${match}.txt"
first=$(date +%Y%m%d -d "$first 1 day")
done
Adicione seu processamento em vez de echo ...
.
Isso usa aritmética de data , onde "n dia "é adição de dias à data indicada", -n dia "também trabalha para subtração.
(Caso você já o encontre, as antigas versões date
( sh-utils ) permitiram um recurso de normalização mktime()
, você poderia simplesmente continuar incrementando o dia do mês até 99, e seria silenciosamente para você:
$ date -d 20160832
Thu Sep 1 00:00:00 IST 2016
Algo muito semelhante (mas possivelmente não idêntico no comportamento) também pode ser com timestamps do sistema de arquivos usando o GNU find
e suas opções relacionadas ao tempo de modificação ( -mtime
, -daystart
e mais).
Uma variação possivelmente útil é usar o globbing estendido do bash (via @(pattern)
) para que você possa lidar com todos os arquivos de uma só vez:
#!/usr/bin/bash
first=$1
last=$2
globlist=$1
while [[ $first -le $last ]]; do
first=$(date +%Y%m%d -d "$first 1 day")
globlist="${globlist}|${first}"
done
shopt -s nullglob extglob
filelist="$(echo filename_@($globlist).txt)" # NB whitespace in filenames
echo "filelist is: $filelist"
filearr=( filename_@($globlist).txt ) # safer for troublesome names
declare -p filearr
Isso também define nullglob
para que zero corresponda resulta em uma string vazia em vez de um erro.
Isso é útil quando é melhor realizar uma única operação em vários arquivos (por exemplo, tar
ou rsync
).