Linux下檔案內容更新了,資料夾時間戳卻沒變?

roc_guo發表於2022-07-06
Linux下檔案內容更新了,資料夾時間戳卻沒變?Linux下檔案內容更新了,資料夾時間戳卻沒變?

Desk with stationary. Studio shot on wooden background.

比如,起始狀態:

ysx@localhost:~/trash/ehbio$ ls -ltr
total 0
drwxr-xr-x. 2 ysx ehbio 6 Jan  7 10:48 webserver
drwxr-xr-x. 2 ysx ehbio 6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio 6 Jan  7 10:48 bioinfoservice

在webserver資料夾下,增加一個檔案,record.md

ysx@localhost:~/trash/ehbio$ cat <webserver/record.md
完成9個生物線上資料儲存、查詢和分析網站的建設。
END

再檢視下資料夾日期有沒有變化,發生變化了,為我們新增檔案的日期。

ysx@localhost:~/trash/ehbio$ ls -ltr webserver/record.md
-rw-r--r--. 1 ysx ehbio 74 Jan  7 10:49 webserver/record.md
ysx@localhost:~/trash/ehbio$ ls -ltr
total 0
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 bioinfoservice
drwxr-xr-x. 2 ysx ehbio 22 Jan  7 10:49 webserver

那麼再繼續追加內容,還是使用cat (不同寫入方式也有影響,後面會提到)。

ysx@localhost:~/trash/ehbio$ cat <>webserver/record.md 
2. 一個網站發表於NAR資料庫專刊,3個網站正在投稿中。
END

這時再看資料夾日期,發現與檔案不同步了。檔案日期更新了,資料夾日期卻沒變。

ysx@localhost:~/trash/ehbio$ ls -ltr webserver/record.md
-rw-r--r--. 1 ysx ehbio 148 Jan  7 10:52 webserver/record.md
ysx@localhost:~/trash/ehbio$ ls -ltr
total 0
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 bioinfoservice
drwxr-xr-x. 2 ysx ehbio 22 Jan  7 10:49 webserver

這是為什麼呢? 檔案內容更新了,資料夾時間戳卻未變。那麼件夾的更新日期是什麼決定的呢?

我們在使用less操作時,有時會不小心對一個資料夾進行less操作。看上去就像資料夾裡的內容變成了一個文字檔案。

ysx@localhost:~/trash/ehbio$ less webserver/
total 4
drwxr-xr-x. 2 ysx ehbio  22 Jan  7 10:49 ./
drwxr-xr-x. 5 ysx ehbio  70 Jan  7 10:48 ../
-rw-r--r--. 1 ysx ehbio 148 Jan  7 10:52 record.md

而資料夾確實是類似文字檔案的方式儲存的,資料夾可以看做檔案inode:檔名組成的文字檔案 (檔案的屬性資訊存在inode的元資訊中,可以用stat file檢視)。只要資料夾內未發生檔案的新增、刪除、軟鏈或資料夾內檔案的inode (也稱為索引節點)未改變,資料夾 (代表資料夾的文字檔案)的時間戳就不會發生變化。

webserver資料夾的文字儲存(第一例為inode,第二列是檔名)

2763934 .  
2764125 ..   
104480 record.md

而我們每次追加檔案內容都未改變檔名字和檔案的inode,所以資料夾的日期未發生變化。

# -i可檢視檔案的inode
ysx@localhost:~/trash/ehbio$ ls -ai webserver/
2763934 .  2764125 ..   104480 record.md
ysx@localhost:~/trash/ehbio$ cat <>webserver/record.md 
> 3. 繼續為大資料的再次利用和更方便利用而努力
> END
ysx@localhost:~/trash/ehbio$ ls -ai webserver/
2763934 .  2764125 ..   104480 record.md

關於資料夾日期更新的問題算是解決了。

另一個問題是,雖然同事的檔案更新了,資料夾時間戳一般不改變。但我發現我每次更新完檔案內容,資料夾的日期卻都會變化,看上去與前面的認知矛盾。想了下,更新時用到的文字編輯器不用,問題是否可能出在vim上(我每次都使用它來更新檔案),下面看一下。

大家注意這裡面webserver日期與webserver/record.md日期的變化和ls -i的輸出結果的變化。

ysx@localhost:~/trash/ehbio$ ls -ltr 
total 0
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 bioinfoservice
drwxr-xr-x. 2 ysx ehbio 22 Jan  7 10:49 webserver
ysx@localhost:~/trash/ehbio$ ls -ltr webserver/record.md 
-rw-r--r--. 1 ysx ehbio 212 Jan  7 11:03 webserver/record.md
# -i可檢視檔案的inode
ysx@localhost:~/trash/ehbio$ ls -i webserver/record.md
104480 webserver/record.md
ysx@localhost:~/trash/ehbio$ vim webserver/record.md
ysx@localhost:~/trash/ehbio$ ls -ltr webserver/record.md 
-rw-r--r--. 1 ysx ehbio 215 Jan  7 11:06 webserver/record.md
ysx@localhost:~/trash/ehbio$ ls -ltr
total 0
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 bioinfoservice
drwxr-xr-x. 2 ysx ehbio 22 Jan  7 11:06 webserver
# -i可檢視檔案的inode
ysx@localhost:~/trash/ehbio$ ls -i webserver/record.md
2465326 webserver/record.md

確實是vim改變了檔案的inode,也就是說在我們使用vim修改檔案時,vim為了避免中間出現意外,先重新命名了修改前的檔案,修改後的檔案以之前檔案的名字儲存,看上去我們做的是原位修改, 實際上是換了新的檔案,所以inode發生了變化。當然這個操作可以自己配置修改。

在另外一個情況下,如果我們對資料夾無可寫許可權,但對該資料夾內的檔案有可寫許可權時,vim自動呼叫另外一個方式修改檔案,先把檔案做個備份,然後原位修改。這時資料夾的時間戳就不會變了。

ysx@localhost:~/trash/ehbio$ chmod a-w webserver/
ysx@localhost:~/trash/ehbio$ ls -ltr
total 0
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 bioinfoservice
dr-xr-xr-x. 2 ysx ehbio 22 Jan  7 11:06 webserver
# 寫不進去,無許可權
ysx@localhost:~/trash/ehbio$ vim webserver/a
# 可以修改, 但沒有新檔案產生
ysx@localhost:~/trash/ehbio$ vim webserver/record.md 
ysx@localhost:~/trash/ehbio$ ls -ltr webserver/record.md
-rw-r--r--. 1 ysx ehbio 249 Jan  7 11:15 webserver/record.md
# 資料夾時間戳未變
ysx@localhost:~/trash/ehbio$ ls -ltr
total 0
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 train
drwxr-xr-x. 2 ysx ehbio  6 Jan  7 10:48 bioinfoservice
dr-xr-xr-x. 2 ysx ehbio 22 Jan  7 11:06 webserver
# 檔案inode也未變
ysx@localhost:~/trash/ehbio$ ls -i webserver/record.md
2465326 webserver/record.md

設計軟體時,需要考慮的問題和情況還是挺多的。看上去挺簡單的事情,裡面說不準有多少”坑”需要注意,寫網站這樣,寫工具也這樣,作分析也是這樣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2904395/,如需轉載,請註明出處,否則將追究法律責任。

相關文章