查找最新文件

查找最新文件

如何找出给定目录中最近访问的文件?

我可以使用该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-

相关内容