尋找最新文件

尋找最新文件

如何找出給定目錄中最近訪問的文件?

我可以使用該find命令列出最後n幾分鐘修改/訪問的所有檔案。但就我而言,我不確定最後一個文件何時被修改/存取?我所需要的只是列出所有其他子文件或子目錄中最近訪問/修改的所有文件,例如按訪問/修改時間排序。

那可能嗎?

答案1

要列印最後 3 個存取的檔案(從最後造訪的檔案到倒數第三個存取的檔案排序):

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'

要列印最後 3 個修改的檔案(從最後修改的檔案到倒數第三個修改的檔案排序):

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
  • find . -type f -exec stat -c '%X %n' {} \;:列印目前目錄層次結構中每個檔案的最後存取時間,後面接著檔案路徑;
  • find . -type f -exec stat -c '%Y %n' {} \;:列印目前目錄層次結構中每個檔案的最後修改時間,後面接著檔案路徑;
  • sort -nr:按數字逆序排序;
  • cut -d' ' -f2-:列印從第二個欄位開始的所有空格分隔欄位;
  • awk 'NR==1,NR==3 {print}':列印 #1-3 範圍內的行。

您可以透過將 3 變更為所需的檔案數來變更要顯示的檔案數awk 'NR==1,NR==3 {print}'

這個答案是基於 GNU 版本stat,因此基於 BSD 的系統上的使用者必須更改stat命令的格式字串才能列印相關時間戳

~ % touch file\ 1
~ % touch file\ 2
~ % touch file\ 3
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % cat file\ 1
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 1
./file 3
./file 2
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 3
./file 2
./file 1
~ % touch file\ 2
~ % find . -type f -exec stat -c '%X %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 2
./file 1
./file 3
~ % find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | cut -d' ' -f2- | awk 'NR==1,NR==3 {print}'
./file 2
./file 3
./file 1

答案2

如果您希望給定目錄中的檔案按修改時間排序(最近的在前):

ls -t

若要按訪問時間排序,請新增該-u選項。

ls -tu

但是,請注意現代 Linux 系統預設不會追蹤準確的存取時間。因此訪問時間戳可能不可靠。

如果您想在目錄樹(包括子目錄)中找到最新的文件,迄今為止最簡單的方法是使用 zsh全域限定符

print -lr -- **/*(om)

使用oa而不是om使用訪問時間而不是修改時間。您可以限制匹配,例如獲取 10 個最新文件:

print -lr -- **/*(om[1,10])

這些會跳過隱藏檔案。如果您還想考慮隱藏文件,請新增Dglob 限定符。您也可以新增.glob 限定符以僅考慮常規的檔案(不考慮符號連結、目錄、fifo...),和mm-60/或mh-1限制為最近一小時內最後修改的檔案。

答案3

您可以使用遞歸開關 ( -R) 以及ls按時間排序開關 ( -t) 和反向排序開關 ( -r) 來列出目錄樹中的所有檔案。這不會按子目錄中的存取/修改日期對所有檔案進行排序,但會按每個子目錄中的該日期獨立對它們進行排序。

使用如下命令:ls -ltrR <sometopdir>.

例子

$ ls -ltrR .
total 759720
-rw-r-----@  1 sammingolelli  staff    2514441 Mar 31  2015 restfulapi-120704053212-phpapp01.pdf
-rw-r-----@  1 sammingolelli  staff     567808 Apr  7  2015 USGCB-Windows-Settings.xls
-rw-r-----@  1 sammingolelli  staff     180736 Apr  7  2015 USGCB-RHEL5-Desktop-Settings-Version-1.2.5.0.xls
-rw-r-----@  1 sammingolelli  staff       6474 Apr  8  2015 tap_kp_mavericks.txt

./kerberos:
total 5464
-rw-r-----@ 1 sammingolelli  staff    37317 Oct  2 13:03 Set_up_Kerberos_instruction_d8.docx
-rw-r-----@ 1 sammingolelli  staff  2753195 Oct 13 13:49 Keberos configuration with AD 01_09_2014.pdf

./homestarrunner:
total 10624
-rw-rw-rw-@ 1 sammingolelli  staff   319422 May 10  2000 error_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    53499 Jun  8  2001 sb_duck.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   199254 Mar 11  2002 email_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff    39288 Mar 25  2002 bubs_dontutalk.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    75432 May  6  2002 trash_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298946 Dec  1  2002 error_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298686 Dec  1  2002 startup_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    90279 Dec  1  2002 sb_meedlymee.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    73561 Dec  1  2002 sb_dubdeuce.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   193097 Dec  1  2002 sb_pizza.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    30093 Dec  1  2002 sb_stiny.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61858 Dec  1  2002 ss_sadflying.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   150142 Dec  1  2002 email_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    68545 Dec  1  2002 bubs_grabbinbutt.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61022 Dec  1  2002 cz_jeorghb.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    40124 Dec  1  2002 marzy_nasty.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   224116 Dec  1  2002 shutdown_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   260546 Dec  1  2002 shutdown_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    57686 Dec  1  2002 trash_hs.wav

答案4

您想要按存取/修改時間對全套「最近」檔案進行排序,而不管它們在檔案樹中的位置如何?

執行此操作的一種方法是使用結果stat列印每個文件的修改時間,然後從結果中列印修改時間。sortcut

對於名稱中包含換行符的文件,這將中斷,但對於其他文件,這裡有一個解決方案,它將列出過去 60 分鐘內修改的文件,按從最近修改到最近修改的順序排列:

find . -type f -mmin -60 -exec stat -c $'%Y\t%n' {} + | sort -nr | cut -f2-

相關內容