7

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

所以我做了前两种情况:

按大小排序

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

按名称分类

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

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

任何帮助,将不胜感激。

4

2 回答 2

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 {} +)
于 2012-12-15T11:28:53.640 回答
1

尝试(做任何事情,将STDINxargs视为参数列表)-t和. 即是这样的:-rls

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

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

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

于 2012-12-15T11:28:38.590 回答