如何从find获取排序输出

时间:2017-03-19 09:28:01

标签: sorting unix find

我有这个命令(thanx to dgeorgiev):

find /somePath -maxdepth 1 -name "log.out*" -type f \
     -printf "Date: %TY-%Tm-%Td - Time: %TT - File: %f\n" -exec tail -n5 {} \;

我希望它的输出按日期排序&时间,所以我最后得到最新的文件。我想没有办法告诉find-command这样做。所以我可能不得不以某种方式将find,sort,tail结合起来。但是如何?

1 个答案:

答案 0 :(得分:0)

我建议在输出中为unix时间戳添加另一个字段。在gnu中找到-printf格式字符串,这表示为%T@

例如,要对所有内容进行排序,您可以执行此操作:

find / -type f -printf "%T@ Date: %TY-%Tm-%Td - Time: %TT - File: %f\n" \
    | LC_ALL=C sort -n -k1,1 \
    | cut -d' ' -f2-

sort -n -k1,1在第一列(仅第一列)上以数字方式对stdin中的行进行排序。 LC_ALL=C环境变量仅适用于偏执狂。 sort的行为会有所不同,具体取决于区域设置。

最后的cut是删除unix时间戳,如果你不想在输出中删除它。

还有一些替代方案,我将简要描述这些及其缺点。

  • 使用ls

如果您尝试仅列出当前目录中的文件(因此maxdepth为1),那么您可以使用ls -al并查找以-开头的行而不是{{1或d(过滤掉目录和符号链接)。这是以排序顺序获取文件名并继续前进的快速而肮脏的方法。不要将它用于不受信任的输入或可能包含奇怪字符的文件名,它会以神秘的方式打破。

l

有关解析/bin/ls -latr | grep '^-' 输出的警告(https://unix.stackexchange.com/questions/128985/why-not-parse-ls

  • 如果你没有找到GNU,但你确实有perl。

这是一种更强大的处理方式(只对文件名中的换行符进行扼流)并避免基于每个文件的生成过程。我们感兴趣的是时间戳(在这种情况下是ls(已修改),还有mtime(已创建)和ctime(已访问)。

您可以使用perl作为unix时间戳从文件中访问atime,在文件名之前打印它(用空格分隔),在第一列上以数字方式排序,然后删除时间戳。理解为mtime文件两次,一次在stat内,一次在find内,这有一个不幸的缺点。

perl