Для следующего требуется bash
4.4 или новее, GNU find
и GNUsed
(или, по крайней мере, find
и sed
, которые поддерживают NUL в качестве разделителя вывода/ввода):
$ mapfile -d '' files < <(find. -maxdepth 1 -type f -iname '*0728*.dat' -print0 |
sed -z 's:^\./::; s/[0-9][0-9_]\+.dat//')
Это заполняет массив bash(files
)совпадающими именами файлов в текущем каталоге после того, как у них был начальный ./
и расширение даты и времени и.dat, удаленное sed
. Он использует NUL в качестве записи (, то есть разделителя имени файла ), чтобы избежать любых потенциальных проблем с пробелами, переводами строк -, мета-символами оболочки -и т. д. в любом из имен файлов.
find
используется, потому что вы никогда не должны использовать вывод ls
в качестве входных данных для других программ или в качестве аргументов в команде другой программы -, строка -, это небезопасно и ненадежно. См. Почему не разборls
(и что делать вместо )?
Команда find
, конечно, может быть изменена для поиска файлов, соответствующих различным шаблонам, или в подкаталогах -и т. д.
Пример:
$ touch amnbmnbm_jnjmnm_sd_07282019_14_13_17.dat amnbmnb_kjhkj_07282019_11_23_22.dat \
njnkjnjk_AbnBCBB_DE_07282019_07_09_04.dat
$ mapfile -d '' files < <(find. -maxdepth 1 -type f -iname '*0728*.dat' -print0 |
sed -z 's:^\./::; s/[0-9][0-9_]\+.dat//')
$ typeset -p files
declare -a files=([0]="amnbmnbm_jnjmnm_sd_" [1]="amnbmnb_kjhkj_" [2]="njnkjnjk_AbnBCBB_DE_")
$ printf '%s\n' "${files[@]}"
amnbmnbm_jnjmnm_sd_
amnbmnb_kjhkj_
njnkjnjk_AbnBCBB_DE_
Решением проблем, связанных со сравнением времени, является преобразование даты и времени в целое число секунд. Затем, если вы помните отметку времени из предыдущей записи, вы можете выполнить арифметические действия, чтобы найти различия, превышающие 60 секунд.
GNU awk имеет некоторые функции времени, встроенные -в
gawk -F'[. :]+' '
{timestamp = mktime($1" "$2" "$3" "$4" "$5" "$6)}
NR == 1 {prev = timestamp}
timestamp - prev >= 60 {print}
{prev = timestamp}
' selfdriving.log
2021.04.01. 13:16:59:87 86 116 119
2021.04.01. 13:18:50:65 75 96 109
Чтобы получить количество записей, вы можете
| wc -l
, чтобы получить количество, или