Можно использовать команду date для получения текущего времени
Использование команды date
Создайте пример сообщения лога:
echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S"): log message"
2024-03-31 17:52:48: log message
Создайте образец файла резервной копии.
current_datetime="$(TZ=UTC date +%Y-%m-%d_%H%M%S)" tar --create --gzip --file "ssh-${current_datetime}.tar.gz" .ssh find ./ -maxdepth 1 -name "ssh-*.tar.gz"
./ssh-2024-03-31_165128.tar.gz
Использование форматирования, подобного strftime
Создайте пример сообщения лога:
TZ=UTC printf "%(%Y-%m-%d %H:%M:%S)T: %s\n" "-1" "log message"
2024-03-31 18:15:43: log message
Создайте образец файла резервной копии.
TZ=UTC printf -v current_datetime "%(%Y-%m-%d_%H%M%S)T" "-1" tar --create --gzip --file "ssh-${current_datetime}.tar.gz" .ssh find ./ -maxdepth 1 -name "ssh-*.tar.gz"
./ssh-2024-03-31_181740.tar.gz
Этот метод намного проще, особенно в первом случае.
Дополнительные примечания
В этом нет ничего нового, поскольку данная функциональность существует уже более десяти лет, но используется редко.
Как правило, производительность не вызывает проблем, поскольку эти команды выполняются только один или несколько раз во время выполнения сценария оболочки.
Однако если вам нужно выполнить эти операции тысячи раз, то использование форматирования, подобного strftime, может быть более эффективным, чем вызов команды date в подоболочке.
Выполнение команды date в подоболочке.
$ /usr/bin/time --verbose bash -c 'for i in $(seq 1 10000); do echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S"): log message" >/dev/null; done'
Command being timed: "bash -c for i in $(seq 1 10000); do echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S"): log message" >/dev/null; done" User time (seconds): 6.40 System time (seconds): 1.83 Percent of CPU this job got: 101% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:08.08 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 4408 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 1538620 Voluntary context switches: 30024 Involuntary context switches: 3358 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Выполнение форматирования типа strftime.
$ /usr/bin/time --verbose bash -c 'for i in $(seq 1 10000); do TZ=UTC printf "%(%Y-%m-%d %H:%M:%S)T: %s\n" "-1" "log message" >/dev/null; done'
Command being timed: "bash -c for i in $(seq 1 10000); do TZ=UTC printf "%(%Y-%m-%d %H:%M:%S)T: %s\n" "-1" "log message" >/dev/null; done" User time (seconds): 0.23 System time (seconds): 0.07 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.31 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 4556 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 543 Voluntary context switches: 3 Involuntary context switches: 31 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Разница существенна, но обычно она минимальна, поскольку обычно выполняется всего один раз в начале скрипта а не десять тысяч раз.