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 スタックでストリームのデバッグを簡単にする方法

推薦する

複数サーバーの負荷分散を実現するためのNginx構成

Nginx ロード バランシング サーバー: IP: 192.168.0.4 (Nginx-Serv...

Vue の v-model ディレクティブと .sync 修飾子の違いの詳細な説明

目次vモデル.sync微妙な違い機能シナリオを要約します。 vモデル <!--親コンポーネント...

MySQL 増分バックアップとブレークポイントリカバリスクリプトの例

導入増分バックアップとは、完全バックアップまたは最後の増分バックアップの後、後続の各バックアップでは...

異なるドメイン名への PC または携帯電話のアクセスを区別するように Nginx を構成する方法

新しい公式サイトはオンラインですが、携帯電話で新しい公式サイトにアクセスすると、エクスペリエンスが非...

HTML で特定のテキストを非表示にするにはどうすればよいでしょうか?

テキスト非表示コード、HTML 内の特定のテキストを非表示にするコードをコピーコードは次のとおりです...

CSS における要素の表示モード

CSS では、要素タグは、要素の表示モードの違いに応じて、インラインレベル要素とブロックレベル要素の...

よくある Linux 英語エラーの中国語翻訳 (初心者必見)

1.コマンドが見つかりません コマンドが見つかりません2. そのようなファイルまたはディレクトリは...

CentOS7 ファイアウォールとオープンポートの簡単な使い方の簡単な紹介

概要(公式にはより詳しい説明があります) Firewalld は、ネットワーク接続またはインターフェ...

マウスの尾行効果を実現する JavaScript

マウス効果では、setTimeout を使用して固定時間にノードを生成し、ノードを削除し、生成された...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

Dockerデータボリューム操作の実装

データボリュームの使用開始先ほどのケースでは、ホストからコンテナにデータをコピーする必要がある場合、...

MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...

Nginx の動的および静的分離実装ケースのコード分析

静的と動的の分離動的リクエストと静的リクエストはミドルウェアを通じて分離され、不要なリクエストの消費...

JavaScript関数の詳細な説明これを指す問題

目次1.関数内のこの方向1. 通常の機能2. コンストラクター3. オブジェクトメソッド4. イベン...

Spring jdbc のデータベース操作オブジェクト モデルの詳細な例

Spring jdbc のデータベース操作オブジェクト モデルの詳細な例Spring Jdbc デー...