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


27

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

随着ls我可以这样做:

ls -Shal |head

获取前10大文件,并:

ls -halt |head

获取前10个最新文件

通过查找,我可以做到:

find . -size +20M

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

有什么方法可以列出一定大小的最近十大文件,最好使用ls

Answers:


24

对于“当前目录”选项find-maxdepth 1。您需要的整个命令行是:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

要么

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

注意:这将对GNU查找有效,但不适用于其他所有查找。

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

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

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

然后,按相反​​的顺序对数字进行排序,将首先给出最年轻的文件,然后我们用20行¹ head

最后,sed用于丢弃时间信息。

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


1
如果使用file-ls命令,则特殊字符将被打印为反斜杠转义字符:find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'。此外ls -l-l无论如何,格式也将看起来像,EoghanM也已指定。
manatwork 2011年

printf仅适用于特定的GNU发行版。
Brethlosze

%T+产生人类可读的时间戳等2018-11-06+13:37:54.4606466460其也可排序由sort(无-n),见:unix.stackexchange.com/questions/29899/...
西罗桑蒂利新疆改造中心法轮功六四事件

5

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])

2

我认为这可能是解决问题的更好方法。

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

为了消除查找时尝试访问您无权读取的文件时出现的任何错误,您可能需要添加

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

这将仅打印指定的10个文件,无论文件名中是否包含任何嵌入式换行符。它使用文件系统inodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

感谢所有的答案。我追求的是以下几点:

ls -halt | grep "M " |head

尽管它放弃了20 MB,而是支持超过1 MB(以及1 GB以下)的任何内容,但它很容易记住并保留了文件大小的可读性。


4
你应该尝试分析的输出ls,就说明你的文件的表示,仅此而已。对于简单的文件名,输出通常恰好与文件名等效,但是您不应该依赖它。
克里斯·

我敢肯定,这是对的,但是对于人类用户而言(并且输出未通过其他渠道传递
EoghanM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.