如何查找大于某个大小的文件,并按最后修改日期对它们进行排序?

时间:2012-12-15 11:13:00

标签: bash find

我需要编写脚本,写下所选目录中的每个文件,这些文件大于某个大小。另外,我需要按大小,名称和最后修改日期对它们进行排序。

所以我做了前两个案例:

按大小排序

RESULTS=`find $CATALOG -size +$SIZE | sort -n -r | sed 's_.*/__'`

按名称排序

RESULTS=`find $CATALOG -size +$SIZE | sed 's_.*/__' | sort -n `

但我不知道如何按最后修改日期对结果进行排序。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:11)

如果您没有太多文件,最佳方法之一就是使用ls进行排序。

按名称排序并按行打印一个文件:

find $CATALOG -size +$SIZE -exec ls -1 {} +

按大小排序并每行打印一个文件:

find $CATALOG -size +$SIZE -exec ls -S1 {} +

按修改时间排序,每行打印一个文件:

find $CATALOG -size +$SIZE -exec ls -t1 {} +

您还可以使用ls开关进行游戏:使用长列表格式按修改时间(小优先)排序,具有人类可读的尺寸:

find $CATALOG -size +$SIZE -exec ls -hlrt {} +

哦,您可能只想find个文件(并忽略目录):

find $CATALOG -size +$SIZE -type f -exec ls -hlrt {} +

最后,一些评论:避免使用bash中的大写变量名(它被认为是不好的做法)并避免反向标记,而是使用$(...)。如,

results=$(find "$catalog" -size +$size -type f -exec ls -1rt {} +)

此外,您可能不希望将所有结果放在像上一行那样的字符串中。您可能希望将结果放在数组中。在这种情况下,请使用mapfile,如下所示:

mapfile -t results < <(find "$catalog" -size +$size -type f -exec ls -1rt {} +)

答案 1 :(得分:1)

尝试xargs(做任何事情,将STDIN视为参数列表)以及-t-r标记到ls。 就像这样:

find $CATALOG -size +$SIZE | xargs ls -ltr

这将为您提供按上次修改日期排序的文件。

一次按多个属性排序对于shell实用程序和管道来说真的很尴尬 - 我认为你需要使用脚本语言(ruby,perl,php,等等),除非你的shell fu是强。