回答:
ディレクトリの作成日を知る方法があります。次の手順に従ってください。
コマンドでディレクトリのiノードを知るls -i
(たとえば、そのXを言う)
df -T /path
コマンドでディレクトリが保存されているパーティションを確認します(オンと言います /dev/sda1
)
次のコマンドを使用します。 sudo debugfs -R 'stat <X>' /dev/sda1
出力に表示されます:
crtime: 0x4e81cacc:966104fc -- mon Sep 27 14:38:28 2013
crtime はファイルの作成日です。
私がテストしたもの:
ファイルを作成して変更しました。
私はコマンドを試しましたが、それは正確な時間を与えました。
statx()
2019
@Nuxは、これに対するすばらしい解決策を見つけました。すべてを直接実行するために使用できる小さな関数を作成することにしました。これをに追加するだけ
~/.bashrc
です。
get_crtime() {
for target in "${@}"; do
inode=$(stat -c '%i' "${target}")
fs=$(df --output=source "${target}" | tail -1)
crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null |
grep -oP 'crtime.*--\s*\K.*')
printf "%s\t%s\n" "${target}" "${crtime}"
done
}
これで、get_crtime
好きなだけファイルまたはディレクトリの作成日を印刷することができます:
$ get_crtime foo foo/file
foo Wed May 21 17:11:08 2014
foo/file Wed May 21 17:11:27 2014
cp -p
または同様のことを行わないように明示的に選択しない限り、コピーが作成された瞬間に設定されます。
df
この--output
オプションをサポートしていないようです。その場合、その行を置き換えることができfs=$(df foo | awk '{a=$1}END{print a}'
、関数も機能します。この回答で示しているのは、ファイル/ディレクトリターゲットに対して直接実行できる方法で、受け入れられた回答からコマンドをラップする方法です。
stat
作成時間を表示できないのは、stat(2)
システムコールの制限によるものです。システムコールの戻り構造体には、作成時間のフィールドが含まれていません。ただし、Linux 4.11(17.10以降)以降では、新しいstatx(2)
システムコールを使用できます。これには、戻り構造体に作成時間が含まれています。
*おそらく、ハードウェアイネーブルメントスタック(HWE)カーネルを使用する古いLTSリリースで。確認のuname -r
ために、少なくとも4.11でカーネルを使用しているかどうかを確認します。
残念ながら、Cプログラムでシステムコールを直接呼び出すのは簡単ではありません。通常、glibcは作業を簡単にするラッパーを提供しますが、glibcはstatx(2)
2018年8月(バージョン2.28、18.10で利用可能)にのみラッパーを追加しました。幸いなことに、@ whotwagnerは、statx(2)
x86およびx86-64システムでシステムコールを使用する方法を示すサンプルCプログラムを作成しました。出力は、stat
書式設定オプションのないデフォルトと同じ形式ですが、出生時のみを印刷するように変更するのは簡単です。
まず、クローンを作成します。
git clone https://github.com/whotwagner/statx-fun
statx.c
コードをコンパイルできます。または、誕生時間だけが必要な場合birth.c
は、次のコードを使用してクローンディレクトリにを作成します(statx.c
ナノ秒精度を含む作成タイムスタンプのみを印刷する最小バージョンです)。
#define _GNU_SOURCE
#define _ATFILE_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include "statx.h"
#include <time.h>
#include <getopt.h>
#include <string.h>
// does not (yet) provide a wrapper for the statx() system call
#include <sys/syscall.h>
/* this code works ony with x86 and x86_64 */
#if __x86_64__
#define __NR_statx 332
#else
#define __NR_statx 383
#endif
#define statx(a,b,c,d,e) syscall(__NR_statx,(a),(b),(c),(d),(e))
int main(int argc, char *argv[])
{
int dirfd = AT_FDCWD;
int flags = AT_SYMLINK_NOFOLLOW;
unsigned int mask = STATX_ALL;
struct statx stxbuf;
long ret = 0;
int opt = 0;
while(( opt = getopt(argc, argv, "alfd")) != -1)
{
switch(opt) {
case 'a':
flags |= AT_NO_AUTOMOUNT;
break;
case 'l':
flags &= ~AT_SYMLINK_NOFOLLOW;
break;
case 'f':
flags &= ~AT_STATX_SYNC_TYPE;
flags |= AT_STATX_FORCE_SYNC;
break;
case 'd':
flags &= ~AT_STATX_SYNC_TYPE;
flags |= AT_STATX_DONT_SYNC;
break;
default:
exit(EXIT_SUCCESS);
break;
}
}
if (optind >= argc) {
exit(EXIT_FAILURE);
}
for (; optind < argc; optind++) {
memset(&stxbuf, 0xbf, sizeof(stxbuf));
ret = statx(dirfd, argv[optind], flags, mask, &stxbuf);
if( ret < 0)
{
perror("statx");
return EXIT_FAILURE;
}
printf("%lld.%u\n", *&stxbuf.stx_btime.tv_sec, *&stxbuf.stx_btime.tv_nsec);
}
return EXIT_SUCCESS;
}
次に:
$ make birth
$ ./birth ./birth.c
1511793291.254337149
$ ./birth ./birth.c | xargs -I {} date -d @{}
Mon Nov 27 14:34:51 UTC 2017
理論的には、これにより作成時間がよりアクセスしやすくなります。
debugfs
ext2 / 3/4ファイルシステム用のツールであり、他では使用できません)make
やなどの必要なパッケージをインストールする場合を除くlinux-libc-dev
)。たとえば、xfsシステムをテストします。
$ truncate -s 1G temp; mkfs -t xfs temp; mkdir foo; sudo mount temp foo; sudo chown $USER foo
$ touch foo/bar
$ # some time later
$ echo > foo/bar
$ chmod og-w foo/bar
$ ./birth foo/bar | xargs -I {} date -d @{}
Mon Nov 27 14:43:21 UTC 2017
$ stat foo/bar
File: foo/bar
Size: 1 Blocks: 8 IO Block: 4096 regular file
Device: 700h/1792d Inode: 99 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ muru) Gid: ( 1000/ muru)
Access: 2017-11-27 14:43:32.845579010 +0000
Modify: 2017-11-27 14:44:38.809696644 +0000
Change: 2017-11-27 14:44:45.536112317 +0000
Birth: -
ただし、これはNTFSおよびexfatでは機能しませんでした。それらのFUSEファイルシステムには作成時間は含まれていなかったと思います。
glibcがstatx(2)
システムコールのサポートを追加した場合、またはそうなるとstat
すぐに続きstat
、このために単純な古いコマンドを使用できるようになります。しかし、新しいカーネルを入手したとしても、これがLTSリリースにバックポートされるとは思いません。だから、私は期待しないstat
で任意の現在のLTSリリース、これまで手動での介入なしに作成時刻を印刷する(14.04、16.04、または18.04)。
ただし、18.10では、statx
説明されているように関数を直接使用できますman 2 statx
(glibcがまだラッパーを追加していないことを示す18.18のマンページは間違っています)。
1
か?
TL; DR:
実行するだけです:
sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
(fsを計算するには、実行しますdf -T /path/to/your/file
。ほとんどの場合、実行されます/dev/sda1
)。
ロングバージョン:
次の2つのコマンドを実行します。
ファイルのパーティション名の名前を見つけます。
df -T /path/to/your/file
出力は次のようになります(パーティション名が最初です)。
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/<your fs> ext4 7251432 3481272 3509836 50% /
そのファイルの作成時間を調べます。
sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
出力で、を探しますctime
。