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

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

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

我可以这样ls做:

ls -Shal |head

获取前 10 个最大的文件,并且:

ls -halt |head

获取前 10 个最新文件

通过 find 我可以这样做:

find . -size +20M

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

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

答案1

“当前目录”选项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

答案2

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

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

像@Rajish 一样开始,但使用printf命令 fromfind来指定输出格式。有3种与时间相关的格式,atime、ctime时间-%T用于 mtime,%A用于%C其他格式。

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

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

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

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

答案3

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

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

答案4

这将仅打印指定的 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

相关内容