Linux でファイルの作成時間を取得する方法と実践的なチュートリアル

Linux でファイルの作成時間を取得する方法と実践的なチュートリアル

背景

ファイルの作成時刻を取得する必要がある場合があります。

例えば:

「xtrabackup スキーマ」を調べていたとき、xtrabackup_log が最初に作成されたファイルであり、最後に保存されたファイルであることを観察して確認したいと思いました。 xtrabackup_logfile ファイルの作成タイムスタンプと変更タイムスタンプを知る必要があります。

レビュー: Linux ファイルの 3 つのタイムスタンプ

Linux ファイル システムには 3 つのタイムスタンプが保存されており、stat コマンドを使用してファイル情報を表示することで取得できます。それらは、ATime、MTime、CTime です。

[root@192-168-199-198 バックアップ]# stat 2.txt 
 ファイル: '2.txt'
 サイズ: 16 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 821h/2081d Inode: 15 リンク: 1
アクセス: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
アクセス: 2019-07-23 12:12:14.276981038 +0800
修正: 2019-07-23 12:12:41.415980158 +0800
変更: 2019-07-23 12:12:41.415980158 +0800
 生年月日: -

ATime - ファイルの最終アクセス時刻

ファイルが読み取られるたびに、ATime は stat コマンドによって取得された Access の値に対応するように更新されます。

[root@192-168-199-198 バックアップ]# cat 2.txt #<-- ファイル 121231233123123 を読み取り
[root@192-168-199-198 バックアップ]# stat 2.txt 
 ファイル: '2.txt'
 サイズ: 16 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 821h/2081d Inode: 15 リンク: 1
アクセス: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
アクセス: 2019-07-23 12:22:09.644961733 +0800 #<-- 時間が変わりました 変更: 2019-07-23 12:12:41.415980158 +0800
変更: 2019-07-23 12:12:41.415980158 +0800
 生年月日: -

MTime - ファイルの内容が最後に変更された時刻

ファイルが書き込まれると、stat コマンドによって取得された Modify 値に応じて CTime が更新されます。

[root@192-168-199-198 バックアップ]# echo hello_world > 2.txt #<-- ファイルの内容を変更します [root@192-168-199-198 バックアップ]# stat 2.txt 
 ファイル: '2.txt'
 サイズ: 12 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 821h/2081d Inode: 15 リンク: 1
アクセス: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
アクセス: 2019-07-23 12:22:09.644961733 +0800
変更: 2019-07-23 12:26:23.466953503 +0800 #<-- 時間が変わりました変更: 2019-07-23 12:26:23.466953503 +0800
 生年月日: -

ここでファイルの内容を変更するために vi を使用しないでください。vi を使用してファイルの内容を変更すると、Inode が変更される可能性があり、つまり、観察するファイルは以前のファイルではなくなるためです。これは vi の原理に関連しています。

CTime - ファイル属性が最後に変更された時刻

ファイル ディレクトリが変更されたり、ファイルの所有者、権限などが変更されたりすると、stat コマンドで取得した Change 値に応じて CTime も更新されます。

[root@192-168-199-198 バックアップ]# chmod 777 2.txt #<-- ファイル属性を変更する [root@192-168-199-198 バックアップ]# stat 2.txt 
 ファイル: '2.txt'
 サイズ: 12 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 821h/2081d Inode: 15 リンク: 1
アクセス: (0777/-rwxrwxrwx) Uid: (0/root) Gid: (0/root)
アクセス: 2019-07-23 12:22:09.644961733 +0800
修正: 2019-07-23 12:26:23.466953503 +0800
変更: 2019-07-23 12:30:35.830945320 +0800 #<-- 時間変更生年月日: -

Linux はファイルの作成時刻を取得できませんか?

Linux には ATime、MTime、CTime の 3 種類の時間があることが分かりましたが、ではなぜ CRTime (作成時間) がないのか疑問に思います。

Windows システム (上記) と比較すると、Windows NTFS ファイル システムには「作成時間」を含む 3 つのタイムスタンプがありますが、Linux の設計思想にはファイルの「作成時間」というものがないため、ext ファイル システムの初期バージョンではファイルの「作成時間」がサポートされていません。しかし、ext4 バージョン以降では、ファイルの作成時刻は ext4 ファイル システムの inode に保存されるため、ext4 ファイル システムでも特別な方法を使用してファイルの作成時刻を取得できます。

また、ファイルの作成時刻を取得できるかどうかは、ファイルシステムがそれをサポートしているかどうかによって決まることも説明します。

Linuxでファイル作成時間を取得する手順

CentOS7 Linux システムには、ext4 ファイル システム上のファイルの作成時刻を確認できる debugfs というツールが付属しています。 man debugfs は、ツールの説明が「ext2/ext3/ext4 ファイルシステムデバッガー」であることを発見しました。そのため、xfs ファイルシステムはサポートされていません。

一般的に使用されているxfsファイルシステムがファイル作成時刻の取得をサポートしているかどうか、またそれをどのように取得するかは不明です。読者は公式ドキュメントを参照する必要があります。

1. ファイルのinode番号を取得する

方法1:

[root@192-168-199-198 バックアップ]# stat /backups/2.txt
 ファイル: '/backups/2.txt'
 サイズ: 30 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 821h/2081d Inode: 14 #<--- このリンク: 1
アクセス: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
アクセス: 2019-07-23 12:49:11.462909146 +0800
修正: 2019-07-23 12:49:11.462909146 +0800
変更: 2019-07-23 13:08:20.138871900 +0800
 生年月日: -

方法2:

[root@192-168-199-198 バックアップ]# ls -i /backups/2.txt
14 /バックアップ/2.txt

ここで取得する inode 番号は 14 です。

2. ファイルが保存されているディスクパスを見つける

[root@192-168-199-198 バックアップ]# df -h
ファイルシステムサイズ 使用済み 使用可能使用率 マウント先
/dev/mapper/centos-root 46G 23G 24G 49% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 8.0K 3.9G 1% /dev/shm
tmpfs 3.9G 12M 3.8G 1% /実行
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sdb1 100G 77G 24G 77% /data2
/dev/sdc1 50G 53M 47G 1% /backups #<--- ファイルがここにあることがわかります /dev/sda1 1014M 142M 873M 14% /boot
tmpfs 781M 0 781M 0% /run/user/0

ディスクパスは/dev/sdc1です

3. debugfsを使用してファイルの作成時間を表示する

[root@192-168-199-198 バックアップ]# debugfs -R 'stat <14>' /dev/sdc1
debugfs 1.42.9 (2013 年 12 月 28 日)
Inode: 14 タイプ: 通常 モード: 0644 フラグ: 0x80000
世代: 737271740 バージョン: 0x00000000:00000001
ユーザー: 0 グループ: 0 サイズ: 30
ファイル ACL: 0 ディレクトリ ACL: 0
リンク: 1 ブロック数: 8
フラグメント: アドレス: 0 番号: 0 サイズ: 0
 ctime: 0x5d369644:211c1170 -- 2019 年 7 月 23 日火曜日 13:08:20
 atime: 0x5d3691c7:6e5dbb68 -- 2019 年 7 月 23 日火曜日 12:49:11
 mtime: 0x5d3691c7:6e5dbb68 -- 2019 年 7 月 23 日火曜日 12:49:11
crtime: 0x5d3691c7:6e5dbb68 -- 2019 年 7 月 23 日火曜日 12:49:11
追加の inode フィールドのサイズ: 28
範囲:
(0):35337

ファイル作成時間を取得するスクリプト

ファイル作成の時間ステップ操作を取得するのは少し面倒です(ただし、3つのステップしかありません:))

ここにスクリプトを用意しました

vi ステータス

#!/bin/sh

[ $# -ne 1 ] && echo "使用法: $0 {FILENAME}" && exit 1

INODE=`ls -i $1 |awk '{print $1}'`
ファイル名=$1

#パラメータに / が含まれている場合は、パラメータのディレクトリ パスを取得し、ディレクトリを入力します `echo $FILENAME |grep / 1> /dev/null` && { FPWD=${FILENAME%/*};FPWD=${FPWD:=//;cd ${FPWD};FPWD=`pwd`; } || FPWD=`pwd`

 

配列=(`echo ${FPWD} | sed 's@/@ @g'`)
配列の長さ=${#配列[@]}

((i=${array_length};i>=0;i--)) の場合
する
 配列[$i]の設定を解除
 SUBPWD=`echo " "${array[@]} | sed 's@ @/@g'`
 DISK=`df -h |grep ${SUBPWD}$ |awk '{print $1}'`
 [[ -n $DISK ]] && ブレーク
終わり

 

#ext4 でない場合は終了します [[ "`mount |grep ${DISK} |awk '{print $5}'`" != "ext4" ]] && { echo ${DISK} はタイプ ext4 にマウントされていません。ext4 ファイル システムのみがサポートされています。;exit 2; }

debugfs -R "stat <${INODE}>" ${DISK}

使用:

chmod +x ステータスx
mv statx /usr/sbin/statx

[root@192-168-199-198 バックアップ]# statx 2.txt
debugfs 1.42.9 (2013 年 12 月 28 日)
Inode: 14 タイプ: 通常 モード: 0644 フラグ: 0x80000
世代: 737271740 バージョン: 0x00000000:00000001
ユーザー: 0 グループ: 0 サイズ: 30
ファイル ACL: 0 ディレクトリ ACL: 0
リンク: 1 ブロック数: 8
フラグメント: アドレス: 0 番号: 0 サイズ: 0
 ctime: 0x5d369644:211c1170 -- 2019 年 7 月 23 日火曜日 13:08:20
 atime: 0x5d36bb8f:56eb1e70 -- 2019 年 7 月 23 日火曜日 15:47:27
 mtime: 0x5d3691c7:6e5dbb68 -- 2019 年 7 月 23 日火曜日 12:49:11
crtime: 0x5d3691c7:6e5dbb68 -- 2019 年 7 月 23 日火曜日 12:49:11
追加の inode フィールドのサイズ: 28
範囲:
(0):35337

! ! !実稼働環境では注意して使用してください。シェル スクリプトは例外処理をほとんど行わず、パイプやディレクトリをサポートしておらず、広範囲にテストされていません。

実際の戦闘では、この方法を使用して、「xtrabackup 回路図」が正確かどうかを確認します。

確認する必要があるのは次の点です。

xtrabackup_logは最初に作成されたファイルであり、最後に保存されたファイルです。

1. バックアップを作成する

DATE=`日付 "+%Y%m%d%H%M%S"`
xtrabackup -uroot -proot \
 -S /tmp/mysql3306.sock \
 --バックアップ\
 --target-dir=/backups/$DATE

2. すべてのバックアップファイルのcrtimeを見つける

cd /backups/$DATE
>/tmp/1.txt
>/tmp/2.txt
検索 . -type f >/tmp/1.txt

`cat /tmp/1.txt` 内の i について
する
 { echo -n $i" ";statx $i 2>/dev/null |grep crtime |awk '{print $7}'; } >>/tmp/2.txt
終わり

cat /tmp/2.txt |sort -k2 |less
###以下は出力です###
./ibdata1 23:32:59
./xtrabackup_logfile 23:32:59 #<---このファイルが最初に作成されたファイルであることがわかります。/mysql/engine_cost.ibd 23:33:00
./mysql/gtid_executed.ibd 23:33:00
./mysql/help_category.ibd 23:33:00
./mysql/help_keyword.ibd 23:33:00
./mysql/help_relation.ibd 23:33:00
./mysql/help_topic.ibd 23:33:00
./mysql/innodb_index_stats.ibd 23:33:00
./mysql/innodb_table_stats.ibd 23:33:00
./mysql/プラグイン.ibd 23:33:00
./mysql/server_cost.ibd 23:33:00
./mysql/servers.ibd 23:33:00
./mysql/スレーブマスター情報.ibd 23:33:00
./mysql/slave_relay_log_info.ibd 23:33:00
./mysql/スレーブワーカー情報.ibd 23:33:00
./mysql/タイムゾーン.ibd 23:33:00
./mysql/タイムゾーン_うるう秒.ibd 23:33:00
...
./zabbix/トリガータグ.frm 23:33:09
./zabbix/users.frm 23:33:09
./zabbix/users_groups.frm 23:33:09
./zabbix/usrgrp.frm 23:33:09
./zabbix/valuemaps.frm 23:33:09
./zabbix/widget_field.frm 23:33:09
./zabbix/widget.frm 23:33:09

3. すべてのバックアップファイルのmtimeを見つける

>/tmp/1.txt
>/tmp/2.txt
検索 . -type f >/tmp/1.txt

`cat /tmp/1.txt` 内の i について
する
 { echo -n $i" ";statx $i 2>/dev/null |grep mtime |awk '{print $7}'; } >>/tmp/2.txt
終わり

cat /tmp/2.txt |sort -k2 |less
###以下は出力です###
./ibdata1 23:33:00
./mysql/engine_cost.ibd 23:33:00
./mysql/gtid_executed.ibd 23:33:00
./mysql/help_category.ibd 23:33:00
./mysql/help_keyword.ibd 23:33:00
./mysql/help_relation.ibd 23:33:00
./mysql/help_topic.ibd 23:33:00
./mysql/innodb_index_stats.ibd 23:33:00
./mysql/innodb_table_stats.ibd 23:33:00
./mysql/プラグイン.ibd 23:33:00
...
./xtrabackup_logfile 23:33:09 #<---このファイルが最後に変更され保存されたことがわかります。/zabbix/acknowledges.frm 23:33:09
./zabbix/actions.frm 23:33:09
...
./zabbix/users_groups.frm 23:33:09
./zabbix/usrgrp.frm 23:33:09
./zabbix/valuemaps.frm 23:33:09
./zabbix/widget_field.frm 23:33:09
./zabbix/widget.frm 23:33:09

最後に、ファイルの作成時間と変更時間を確認して、xtrabackup スキーマの最初のステップと 7 番目のステップの正確さを検証しました。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Golang を使用して Linux 上のファイルのアクセス/作成/変更時間を取得する
  • Linux フォルダファイルの作成と削除の解析
  • Linux パーティションまたは論理ボリュームにファイルシステムを作成する方法
  • Linuxでスワップパーティションファイルを作成する方法
  • Linux で binlog ファイルの作成時間を表示するコマンド
  • 日付フォルダまたはファイルを作成する Linux コマンドのサンプルコード

<<:  ノードを使用して静的ファイルキャッシュを実装する方法

>>:  MLSQL スタックでストリームのデバッグを簡単にする方法

推薦する

JavaScript ステートメントの一般的な for ループの詳細な説明

JavaScript には、for、for in、for of、forEach ループなど、多くのル...

Apache での ModSecurity のインストール、有効化、および構成

ModSecurity は、Web サーバーに入るすべてのパケットをチェックする強力なパケット フィ...

Fabric.js は DIY ポストカード機能を実装します

この記事では、DIYポストカード機能を実現するためのfabricjsの具体的なコードを参考までに共有...

XHTML 入門チュートリアル: XHTML Web ページ画像アプリケーション

<br />適度に画像を追加すると、Web ページがより美しくなります。 画像タグ &l...

docker compose idea CreateProcess error=2 システムは指定されたファイルを見つけることができません

Docker の作成Compose の紹介Compose は、マルチコンテナ Docker アプリケ...

21 の MySQL 標準化および最適化のベスト プラクティス!

序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...

Win10+Ubuntu 20.04 LTS デュアル システム インストール (UEFI + GPT) (画像とテキスト、複数の画像には注意)

Win10 のインストール (すでにインストールされている場合はスキップしてください) win10...

Windows での PyTorch 開発環境のインストール チュートリアル

アナコンダのインストールAnaconda は、Python の使用を容易にするために作成されたソフト...

Linux mysql5.5 を mysql5.7 にアップグレードする手順と落とし穴

目次Linux MySQL 5.5 が MySQL 5.7 にアップグレードされました1. mysq...

見落としがちなVue.jsのAPIを詳しく解説

目次次のチェックv-model 構文シュガー.sync 修飾子$セット計算プロパティセット要約する次...

Linux 上での MySQL データベースのリモート展開の詳細な手順

LinuxリモートMySQLデータベースの展開、参考までに、具体的な内容は次のとおりです。 1.0 ...

ネイティブJSで禁止すべきメソッドの記述

目次ブロックレベル関数オブジェクトのプロトタイプを直接変更すると呼び出された人発信者評価ブロックレベ...

MySQLで行を列に変換する方法

MySQL の行から列への操作いわゆる行から列への操作は、テーブルの行情報を列情報に変換することです...

CSSの優先度を理解する2つの方法

方法1: 値を追加する公式の説明を見るには MDN にアクセスしてください。優先度はどのように計算さ...

CSS3は遷移を高速化し、遅延させる

1. 速度制御機能を使用して、トランジション効果(加速、減速など)の速度曲線を制御します。速度制御機...