查找最新文件

SHW*_*SHW 19 find

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

我可以使用该find命令列出最后n几分钟内修改/访问的所有文件。但在我的情况下,我不确定最后一个文件何时被修改/访问?我所需要的只是列出所有其他子文件或子目录中最近访问/修改的所有文件,例如按访问/修改时间排序。

那可能吗?

kos*_*kos 21

打印最近访问的 3 个文件(从最后访问的文件到倒数第三个访问的文件排序):

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'
Run Code Online (Sandbox Code Playgroud)

打印最近修改的 3 个文件(从最后修改的文件到倒数第三个修改的文件排序):

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'
Run Code Online (Sandbox Code Playgroud)
  • find . -type f -exec stat -c '%X %n' *: 打印当前目录层次结构中每个文件的最后访问时间和文件路径;
  • find . -type f -exec stat -c '%Y %n' *: 打印当前目录层次结构中每个文件的最后修改时间和文件路径;
  • sort -nr: 以相反的数字顺序排序;
  • awk 'NR==1,NR==3 {print $2}': 打印第一行、第二行和第三行的第二个字段。

您可以通过将 3 更改为所需的文件数来更改要显示的文件数awk 'NR==1,NR==3 {print $2}'

% touch file1
% touch file2
% touch file3
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% cat file1
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file1
./file3
./file2
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% touch file2
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file2
./file1
./file3
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file2
./file3
./file1
Run Code Online (Sandbox Code Playgroud)

  • 这些命令会因文件名包含空格而中断。罪魁祸首是“awk”,因为我不知道如何使用它,只需将“awk”命令替换为“|” head -n 3`(保留前三个结果)就可以了。如果您仍然想删除时间戳,请将其与“|”链接起来。切-d''-f2-` (4认同)

slm*_*slm 9

您可以使用递归开关 ( -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
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 7

如果您希望给定目录中的文件按修改时间排序(最近的在前):

ls -t
Run Code Online (Sandbox Code Playgroud)

要按访问时间排序,请添加该-u选项。

ls -tu
Run Code Online (Sandbox Code Playgroud)

但是,请注意现代 Linux 系统默认情况下不会跟踪准确的访问时间。所以访问时间戳可能不可靠。

如果您想在目录树中找到最新的文件,包括子目录,目前最简单的方法是使用 zsh 的glob qualifiers

print -lr -- **/*(om)
Run Code Online (Sandbox Code Playgroud)

使用oa而不是om使用访问时间而不是修改时间。您可以限制匹配,例如获取 10 个最近的文件:

print -lr -- **/*(om[1,10])
Run Code Online (Sandbox Code Playgroud)


小智 6

此命令还提供当前目录树中最近修改的文件或目录:

% find . -printf '%TY-%Tm-%TdT%TT %p\n' |sort |tail -1
2019-01-30T17:29:18.0330479800 ./servlet-api/META-INF/NOTICE
Run Code Online (Sandbox Code Playgroud)

当然,您可以将最后一个参数更改为您可能需要的最新文件数。

  • 仅当您可以保证所有文件路径都不包含换行符时,这才有效。另请注意,由于这是在本地时间打印时间戳,因此可能会在 DST 更改时给出不正确的结果。更改为 `TZ=UTC0 查找 . -printf '%TFT%TTZ %p\0' | 排序-rz | 头-zn1 | tr '\0' '\n'` 将解决这些问题。(`-printf`、`-z` 是 GNU 扩展)。 (2认同)
  • (尽管如此,它仍然比当前投票最高的答案要好得多) (2认同)