`stat`出力形式:日付フィールドを切り捨てる

`stat`出力形式:日付フィールドを切り捨てる

stat1つの形式(少なくともLinuxのbashから取得した形式)では、形式修飾子を使用できます。たとえば、%010sサイズフィールドを10文字以上に設定し、左側をゼロで埋めます(ただし、これはRecordedのどこかで機能しますか)。 ?)

フィールドの長さを制限する同じトリックはありますか? %xyz形式から秒の小数部を削除したいと思います。または、出力を後処理するためにsed / awkを使用する必要がありますか?

答え1

GNUツールを使用して、

date -r file +'%F %T %z'

これは、指定されたファイルの最後に変更されたタイムスタンプを取得し(1秒未満の解像度なし)、それを使用してdate生成されたファイルと同じ形式で再フォーマットしますstat -c %y file

例:

$ stat -c '%y' file
2021-03-17 08:53:39.540802643 +0100
$ date -r file +'%F %T %z'
2021-03-17 08:53:39 +0100

書式設定printfには-like型を直接使用できますが、中間文字列を変更することはできません。%y

$ stat -c '%.19y' file
2021-03-17 08:53:39

これにより、19文字以降の文字列が切り捨てられ、1秒未満のデータが削除されますが、タイムゾーン情報も無視されます。

答え2

さて、printfのような長さ/マットを指定できるので(%010s例えば)、実際にフィールドの最大長を文書化する元のprintf文書に戻ります。そして織り...statフォーマットに従って動作します! (日付部分のみを維持するためにここでは切り取った):

stat -c '%.10y %10s %n' /boot/*
2018-05-17    1501659 /boot/abi-4.13.0-43-generic
2018-05-30    1501528 /boot/abi-4.13.0-45-generic
2018-05-17     213220 /boot/config-4.13.0-43-generic
2018-05-30     213220 /boot/config-4.13.0-45-generic
1970-01-01       4096 /boot/efi
2018-06-15       1024 /boot/grub
2018-05-22   52211016 /boot/initrd.img-4.13.0-43-generic
2018-06-22   52210415 /boot/initrd.img-4.13.0-45-generic
2017-04-08      12288 /boot/lost+found
2016-01-28     182704 /boot/memtest86+.bin
2016-01-28     184380 /boot/memtest86+.elf
2016-01-28     184840 /boot/memtest86+_multiboot.bin
2018-05-17        255 /boot/retpoline-4.13.0-43-generic
2018-05-30        255 /boot/retpoline-4.13.0-45-generic
2018-05-17    3884045 /boot/System.map-4.13.0-43-generic
2018-05-30    3883942 /boot/System.map-4.13.0-45-generic
2018-05-17    7713296 /boot/vmlinuz-4.13.0-43-generic
2018-05-22    7715224 /boot/vmlinuz-4.13.0-43-generic.efi.signed
2018-05-30    7712560 /boot/vmlinuz-4.13.0-45-generic
2018-06-14    7714488 /boot/vmlinuz-4.13.0-45-generic.efi.signed

答え3

これは、統計的なタイムスタンプから部品を抽出してからカスタム日付出力を生成する便利な方法です。

#!/bin/bash

given_file=$1   #  supply file to get backed up with timestamp

answer_interstital=$(stat -c '%.16y'  $given_file)  #   2021-08-23 15:09   stat given file extract out last changed timestamp using the -c flag
                                                    #   the   '%.16y'  specifies we want 16 character wide format of timestamp

first_portion=$( echo $answer_interstital  | cut -c6-7,9-10)     #  0823
second_portion=$(echo $answer_interstital  | cut -c12-13,15-16)  #  1509

cool_lastchanged_timestamp="${first_portion}_${second_portion}"  #  print both of above portions separated with an underbar

backup_filename=${given_file}~~${cool_lastchanged_timestamp}   #  create backup file using formatted timestamp

cp -p $given_file  $backup_filename # backup file from    some_file   to    some_file~~0823_1509   

答え4

@nohillsideが提供した元の質問に対するコメントを拡張した場合、日付情報の形式を変更する最も柔軟な方法は、statその時代以降の時間を使用してコマンドを使用して形式を指定することですdate

たとえば、

date --date="@"`stat -c '%Y' file` "+%F %r"

結果:

2023-02-17 01:17:24 PM

パラメーターでは、"+FORMAT"dateコマンドで使用可能なすべての修飾子を使用できます。これを使用して確認できますman date

関連情報