我有这个命令(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结合起来。但是如何?
答案 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)
这是一种更强大的处理方式(只对文件名中的换行符进行扼流)并避免基于每个文件的生成过程。我们感兴趣的是时间戳(在这种情况下是ls
(已修改),还有mtime
(已创建)和ctime
(已访问)。
您可以使用perl作为unix时间戳从文件中访问atime
,在文件名之前打印它(用空格分隔),在第一列上以数字方式排序,然后删除时间戳。理解为mtime
文件两次,一次在stat
内,一次在find
内,这有一个不幸的缺点。
perl