我需要编写脚本,写下所选目录中的每个文件,这些文件大于某个大小。另外,我需要按大小,名称和最后修改日期对它们进行排序。
所以我做了前两个案例:
按大小排序
RESULTS=`find $CATALOG -size +$SIZE | sort -n -r | sed 's_.*/__'`
按名称排序
RESULTS=`find $CATALOG -size +$SIZE | sed 's_.*/__' | sort -n `
但我不知道如何按最后修改日期对结果进行排序。
任何帮助都将不胜感激。
答案 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是强。