Intereting Posts
Ctrl + Start / End не работает в mate-terminal Двойная загрузка Windows 7 и Peppermint (слияние двух дисков) Форматирование и отображение интервала с дробными секундами в оболочке Разница между «.» И «./» при установке переменных среды с использованием экспорта? Найдите разницу между двумя эпохами, которые находятся в имени файла Увеличение объема Как разрешить пользователю монтировать раздел Ubuntu на Arch Linux без проверки подлинности? Дополнение Fedora 18 к VirtualBox ln дает разные результаты при многократном запуске Малиновый Pi Python Talkey (TTS) + Cron Как посчитать количество строк, где все поля имеют какое-то значение? принудительная загрузка функции завершения для zsh (без принудительного ее выполнения путем нажатия на вкладку) Как узнать, включена ли функция ext4lazyinit в вашем ядре или нет? настройка пользовательских файловых систем Как отключить подсветку, но оставить ЖК-дисплей включенным?

Как найти недостающие файлы между определенным диапазоном дат?

Я хочу перемещаться по всем файлам в папке и обнаруживать недостающий файл на определенную дату.

Файлы секционируются по часам, а имя файла имеет формат yyyy-mm-dd-hh .

Таким образом, между 2017-07-01 и 2017-07-02 будет 24 файла с 2017-07-01-00 по 2017-07-01-23

Как я могу найти отсутствующий почасовой файл, если я пройду выше дат в качестве даты начала и окончания?

Оцените любой вход!

 # presuming that the files are eg template-2017-07-01-16: # To test a given date for file in template-2017-07-01-{00..23}; do if ! [[ -f "$file" ]]; then echo "$file is missing" fi done # To test a given year year=2017 for month in seq -w 1 12; do dim=$( cal $( date -d "$year-$month-01" "+%m %Y" | awk 'NF { days=$NF} END {print days}' ) for day in $(seq -w 1 $dim); do for file in template-${year}-${month}-${day}-{00..23}; do if ! [[ -f "$file" ]]; then echo "$file is missing" fi done done done 

В системе GNU:

 #! /bin/bash - ret=0 start=${1?} end=${2?} t1=$(date -d "$start" +%s) t2=$(date -d "$end" +%s) for ((t = t1; t < t2; t += 60*60)); do printf -v file '%(%F-%H)T' "$t" if [ ! -e "$file" ]; then printf >&2 '"%s" not found\n' "$file" ret=1 fi done exit "$ret" 

Обратите внимание, что в день перехода на зимнее время (в часовых поясах, реализующих переход на летнее время), вы можете получить сообщение об ошибке дважды, если файл отсутствует в течение часа коммутатора. Исправьте $TZ до UTC0, если вы хотите 24 часа в день на каждый день (например, если в любом случае для создания этих файлов используется время UTC вместо местного времени).

Как насчет команды, как показано ниже:

  grep -Fvf <(find * -type f \( -name "2017-07-02-00" $(printf " -o -name %s" 2017-07-02-{01..23}) \)) \ <(printf "%s\n" 2017-07-02-{00..23}) 
 ls 2017-07-02-01 2017-07-02-06 2017-07-02-08 2017-07-02-14 2017-07-02-19 2017-07-02-04 2017-07-02-07 2017-07-02-11 2017-07-02-15 2017-07-02-22 

Вывод после команды:

 2017-07-02-00 2017-07-02-02 2017-07-02-03 2017-07-02-05 2017-07-02-09 2017-07-02-10 2017-07-02-12 2017-07-02-13 2017-07-02-16 2017-07-02-17 2017-07-02-18 2017-07-02-20 2017-07-02-21 2017-07-02-23 

Выше мы генерируем все возможности 24 файлов с помощью printf и передаем его, чтобы find его параметр -name который printf также помогает ей, а затем командой grep мы grep что эти файлы существуют в нашем шаблоне, но find их не нашли.

Использование: ./diff_date.sh 2017-08-30-00 2017-09-02-00

 #!/bin/bash # This processing is needed, because `date` require 2017-08-30 00 format, # not 2017-08-30-00. So, last dash is replacing by space in here. start=$(sed 's/-/ /3' <<< "$1") end=$(sed 's/-/ /3' <<< "$2") while [[ "$start" != "$end" ]]; do # Returns dash back to its place and checks - does this file exist. if [ ! -f "${start/ /-}" ]; then echo "${start/ /-}" fi # Performance of this code can be improved, by calling `date` only when # day is changing, not the every hour. start=$(date -d "${start} + 1 hour" "+%F %H") done 

Тестирование:

 # make files $ touch 2017-08-{30..31}-{03..23}; touch 2017-09-{01..02}-{03..23} $ $ ./diff_date.sh 2017-08-30-00 2017-09-02-00 ##### Output - missing files. ##### 2017-08-30-00 2017-08-30-01 2017-08-30-02 2017-08-31-00 2017-08-31-01 2017-08-31-02 2017-09-01-00 2017-09-01-01 2017-09-01-02 

Почему бы не использовать egrep? вы можете повторно использовать его так, как хотите.

  egrep (2017-07-0[1-2]-\d\d$) *file name here*| tail 

regex может быть немного прочь – извините.