Используя date
GNU, вы можете легко проходить по диапазону дат в формате ГГГГММДД:
#!/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).
(В случае , если вы когда - нибудь столкнуться с ним, Древнейшим (ш-Utils эры) версия позволила функцию нормализации date
вы можете просто сохранить приращение дня-месяца до 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
).