Другой вариант решения этой проблемы следующий:
ls | tee Out_File.txt
Вы должны использовать реализацию GNU date
, где это 20200101101010
интерпретируется как 2020010110-10-10T00:00:00
местное время.
-d
— это нестандартная -опция date
, поддерживаемая только несколькими реализациями и теми, где она поддерживается, если вообще нужно вводить дату (, как в GNU, busybox или ast -открыть's date
; BSD date
использует -r
и -v
вместо ), это делается по-разному в разных реализациях.
ast-open
и busybox date
позволяют указать формат ввода (busybox с -D
, ast -open с -p
), хотя и не со смещением, насколько мне известно. Однако вы можете удалить 5 минут, преобразовав сначала в эпоху, удалить 300 секунд и преобразовать обратно в свой формат.
В июле 2019 года было предложение добавить что-то похожее на GNU date
, но оно еще не выпущено (по состоянию на 2020 год -01 -21 ).
В частности, с GNU date
вы можете сначала преобразовать ввод($aaa
)в формат, который он распознает, как в синтаксическом подходе @RakeshShewale ksh93
.
Другим вариантом является использование оболочки zsh
, которая имеет встроенную функцию анализа и форматирования временных меток -и позволяет избежать необходимости полагаться на не -переносимое поведениеdate
:
zmodload zsh/datetime || exit
format=%Y%m%d%H%M%S min=60
aaa=20200101101010
strftime -r -s bbb -- "$format" "$aaa" || exit
strftime -s bbb -- "$format" "$((bbb - 5 * min))"
print -r -- "$bbb"
Вы можете адаптировать $format
по мере необходимости для других форматов, но обратите внимание, что не все директивы формата, поддерживаемые strftime()
(, вызываются strftime
без отметок времени -r
до формата ). strptime()
(, вызванный strftime -r
для разбора временных меток ). Проверьте man 3 strftime
и man 3 strptime
в вашей системе.
a=20200101101010
bbb=$(date --date "${a:0:4}-${a:4:2}-${a:6:2} ${a:8:2}:${a:10:2}:${a:12:2}")
ccc=$(date -d "$bbb -5 mins" +'%Y%m%d%H%M%S')
echo $ccc
выход:
20200101100510