按日期排序列出大于 {size} 的文件

Eog*_*anM 36 ls find

我想解决“列出当前目录中超过 20MB 的前 10 个最新文件”的问题。

随着ls我可以这样做:

ls -Shal |head
Run Code Online (Sandbox Code Playgroud)

获取前 10 个最大的文件,以及:

ls -halt |head
Run Code Online (Sandbox Code Playgroud)

获取前 10 个最近的文件

使用 find 我可以做到:

find . -size +20M
Run Code Online (Sandbox Code Playgroud)

列出当前目录(和我不想要的子目录)中超过 20MB 的所有文件。

有没有办法列出特定大小的前十个最新文件,最好使用ls

Raj*_*ish 30

的“当前目录”选项find-maxdepth 1。满足您需求的整个命令行是:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head
Run Code Online (Sandbox Code Playgroud)

或者

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
Run Code Online (Sandbox Code Playgroud)


use*_*own 8

注意:这适用于 GNU-find,但不适用于所有其他 find。

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'
Run Code Online (Sandbox Code Playgroud)

从@Rajish 开始,但使用printf命令 fromfind指定输出格式。有3个与时间相关格式,的atime,的ctime修改时间-%T是为修改时间,%A并且%C对于其他格式。

@是指定自纪元以来以秒为单位的时间格式。%f用于文件名,\n用于 2 个文件之间的换行符。

然后以相反的顺序按数字排序首先给出最年轻的文件,我们取 20 行¹和head.

最后,sed被用来,扔掉时间信息。

¹) 由于head逐行工作,名称中包含 20 多个换行符的单个文件,这有点不寻常,但不禁止,如果它属于前 20 个匹配项,可能会损坏输出。如果您碰巧有此类文件,请尝试删除它们 - 好吧,更改它们的名称。对于简单的脚本,它们通常是一个问题。


Gil*_*il' 6

Zsh 的glob 限定符使这变得容易。在.预选赛中只选择普通文件,Lm+20选择文件,这些文件至少20MB加上长一个字节; 要包含恰好 20MB 长的文件,请使用L+20971519. 然后om按减少修改时间排序,并将[1,10]扩展限制为前 10 个匹配项。如果要按日期列出文件,您仍然需要-t选择ls;或者您可以将文件传递给其他命令(最年轻的在前)。要将文件首先传递给具有最旧文件的另一个命令,请使用Om通过增加修改时间进行排序并[-10,-1]提取最后 10 个匹配项。

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
Run Code Online (Sandbox Code Playgroud)