我不小心启动了rm -rf
我正在工作的一个大目录。该目录除其他外还包含一个data
包含许多子目录的目录,每个子目录包含数千个文本文件。本质上它看起来像这样
$ tree data
data
├── collection0
│ ├── input
│ │ ├── file0.txt
│ │ ├── file1.txt
│ │ ├── ...
│ │ └── file9999.txt
│ └── output
│ ├── file0.txt
│ ├── file1.txt
│ ├── ...
│ └── file9999.txt
├── ...
└── collection99
├── input
│ ├── file0.txt
│ ├── file1.txt
│ ├── ...
│ └── file9999.txt
└── output
├── file0.txt
├── file1.txt
├── ...
└── file9999.txt
我能够rm -rf
很快地中断该过程,但是当然,在半秒左右的执行时间内,其他子目录中的许多文件被删除了。
我的问题是,有没有办法 100% 确定给定的子目录在此期间是否丢失了任何文件?似乎Modify
丢失文件的目录上的时间已更新为删除文件时的时间,并且使用此方法我思考数据子目录中没有文件被删除(假设2021-09-08是事件的日期rm -rf
):
$ find data -mindepth 2 -maxdepth 2 -type d -exec stat {} -c '%n %y' \;
data/collection0/input 2021-08-28 05:45:49.624228368 -0400
data/collection0/output 2021-08-28 05:45:49.624228368 -0400
...
data/collection99/input 2021-08-29 04:55:38.772912003 -0400
data/collection99/output 2021-08-29 04:55:38.772912003 -0400
$ find data -mindepth 2 -maxdepth 2 -type d -exec stat {} -c '%n %y' \; | grep 2021-09-08
$
这是一个可靠的方法吗?
答案1
Linux 手册页stat(2)
说:
该字段
st_mtime
通过文件修改而更改,例如,通过mknod(2)
、truncate(2)
、utime(2)
和write(2)
(超过零字节)。 此外,st_mtime
目录的更改是通过在该目录中创建或删除文件来更改的。 该st_mtime
字段不会因所有者、组、硬链接计数或模式的更改而更改。该字段
st_ctime
通过写入或设置 inode 信息(即所有者、组、链接计数、模式等)来更改。
rm
所以,是的,如果触及每个目录,应该能够依赖更新的修改时间。当然,前提是事后没有手动重置,但在这种情况下,改变时间戳 (ctime) 应更新。好吧,如果我正确理解了手册页文本,则 ctime 也会在 mtime 更新时更新,因此仅查看该内容就足够了。
另外,只能用mtime来证明否定。如果时间戳被更新,则无法知道它是否是由于删除文件、创建另一个文件或手动修改时间戳而发生的。