我想解决“列出当前目录中超过 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)
注意:这适用于 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 个匹配项,可能会损坏输出。如果您碰巧有此类文件,请尝试删除它们 - 好吧,更改它们的名称。对于简单的脚本,它们通常是一个问题。
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)