Linux

確保在某個時間沒有從目錄中刪除文件

  • September 8, 2021

我不小心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
$

這是一個可靠的方法嗎?

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 來證明是否定的。如果時間戳被更新,則無法知道它是由於文件被刪除、另一個文件被創建還是時間戳被手動修改而發生的。

引用自:https://unix.stackexchange.com/questions/668223