Используя GNU, date
вы можете легко проходить по диапазону дат в формате ГГГГММДД:
#!/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
Добавьте свою обработку вместо echo ...
. При этом используется арифметика даты , где «n день» - это добавление дней к заданной дате, «-n день» также работает для вычитания (хотя следите за этим beartrap, если также присутствует HH: MM).
(В случае, если вы когда-либо сталкивались с этим, в древних date
( эпоха sh-utils ) версиях была предусмотрена mktime()
функция нормализации, вы можете просто увеличивать число дней до 99, и это молча исправит это для вас:
$ date -d 20160832
Thu Sep 1 00:00:00 IST 2016
)
Нечто подобное (но , возможно , не идентичны в поведении) также может быть сделано с файловой системой меток времени с использованием GNU find
и связанные с ним время изменения параметров ( -mtime
, -daystart
и многое другое).
Возможно, полезным вариантом будет использование расширенного сглаживания bash (через @(pattern)
), чтобы вы могли обрабатывать все файлы за один раз:
#!/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
Это также устанавливает nullglob
так, чтобы нулевое совпадение приводило к пустой строке, а не к ошибке. Это полезно, когда лучше выполнить одну операцию над несколькими файлами (например, tar
или rsync
).