stat
1つの形式(少なくとも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
。