Ordenar por 'ls -l' Datas sem usar 'ls'

1

Eu tenho um arquivo de texto com um monte de ls -l output, como:

-rw-r--r-- 1 root root 7554952082 Dec 15 22:11 /var/spool/stuff/Investigation/messages.tgz
-rw-r--r-- 1 root root 4315 Mar  3  2015 /var/spool/stuff/redoneagain.tgz
-rw-r--r-- 1 root root 429786 Apr 22  2014 /var/spool/stuff/random20.tgz

Não consigo executar um novo comando ls porque alguns dos arquivos não existem mais.

O que posso fazer para classificar esses arquivos por essas datas trágicas legíveis para humanos? Eles não são alfabéticos, e alguns deles nem exibem as informações do ano.

Editar Veja um conjunto maior de amostras com nomes de arquivos falsos:

-rw-r--r-- 1 root root 67746 Feb 23 2015 /fake/file/1
-rw-r--r-- 1 root root 665081504 Nov 10 22:26 /fake/file/2
-rw-r--r-- 1 root root 2268687431 Sep 11 2015 /fake/file/3
-rw-r--r-- 1 root root 2322223712 Sep 14 2015 /fake/file/4
-rw-r--r-- 1 root root 67413 Feb 25 2015 /fake/file/5
-rw-r--r-- 1 root root 193782 Oct 28 2013 /fake/file/6
-rw-r--r-- 1 root root 79802627 Nov 23 23:19 /fake/file/7
-rw-r--r-- 1 root root 53336532 Nov 23 23:20 /fake/file/8
-rw-r--r-- 1 root root 99797 Nov 10 00:27 /fake/file/9
-rw-r--r-- 1 root root 19618 Apr 17 2014 /fake/file/10
-rw-r--r-- 1 root root 1856 Oct 18 2013 /fake/file/11
-rw-r--r-- 1 root root 90213 Sep 23 2015 /fake/file/12
-rw-r--r-- 1 root root 1924 Sep 24 2015 /fake/file/13
-rw-r--r-- 1 root root 563907311 Nov 16 17:37 /fake/file/14
-rw-r--r-- 1 root root 193855 Oct 22 2013 /fake/file/15
-rw-r--r-- 1 root root 7554952082 Dec 15 22:11 /fake/file/16
-rw-r--r-- 1 root root 4315 Mar 3 2015 /fake/file/17
-rw-r--r-- 1 root root 429786 Apr 22 2014 /fake/file/18
-rw-r--r-- 1 root root 4870 Apr 18 2014 /fake/file/19
-rw-r--r-- 1 root root 87392 Feb 3 2015 /fake/file/20
-rw-r--r-- 1 root root 552396373 Dec 21 21:25 /fake/file/21
-rw-r--r-- 1 root root 3959214957 Aug 1 2015 /fake/file/22
-rw-r--r-- 1 root root 4678389972 Jul 31 2015 /fake/file/23
-rw-r--r-- 1 root root 5371125 Aug 27 2015 /fake/file/24
-rw-r--r-- 1 root root 2523669282 Jul 24 2015 /fake/file/25
-rw-r--r-- 1 root root 2138312957 Jul 27 2015 /fake/file/26
-rw-r--r-- 1 root root 87953 Feb 20 2015 /fake/file/27
-rw-r--r-- 1 root root 480600954 Nov 17 17:59 /fake/file/28
-rw-r--r-- 1 root root 1009402595 Oct 21 2014 /fake/file/29
-rw-r--r-- 1 root root 14991 Apr 15 2014 /fake/file/30
-rw-r--r-- 1 root root 5993812 Apr 16 2015 /fake/file/31
-rw-r--r-- 1 root root 4278 Feb 27 2015 /fake/file/32
-rw-r--r-- 1 root root 4141 Oct 18 2013 /fake/file/33
-rw-r--r-- 1 root root 8483609907 Aug 21 2015 /fake/file/34
-rw-r--r-- 1 root root 8509124532 Sep 15 2015 /fake/file/35
-rw-r--r-- 1 root root 4232 Dec 11 2014 /fake/file/36
-rw-r--r-- 1 root root 8462334652 Apr 9 2015 /fake/file/37
-rw-r--r-- 1 root root 441345893 Apr 9 2015 /fake/file/38
-rw-r--r-- 1 root root 144456171297 Jun 12 2015 /fake/file/39
-rw-r--r-- 1 root root 223299330621 Jun 3 2015 /fake/file/40
-rw-r--r-- 1 root root 1116344491 Nov 11 22:28 /fake/file/41
-rw-r--r-- 1 root root 15265 Apr 15 2014 /fake/file/42
    
por Hammer Bro. 04.04.2016 / 18:47

3 respostas

2

datesort do pacote dateutils pode fazê-lo:

$ datesort -i '%b %d %Y' -i '%b %d %H:%M' < FILE

O truque é usar dois formatos de entrada porque ls , para datas recentes, omite o ano e mostra a hora.

Disclaimer: Eu sou o autor da ferramenta.

    
por 22.04.2016 / 05:28
0

Você não precisa evitar ls apenas porque o tempo feio (realmente é) é exibido:

-c com -lt: classifique por, e mostre, ctime (hora da última modificação das informações de status do arquivo) com -l: show ctime e classifique por nome caso contrário: classifique por ctime, o mais novo primeiro

    
por 04.04.2016 / 20:00
0

Você pode escrever um pequeno script que analise as strings de data e classifique por data. Algumas das strings de data não dizem qual ano, então eu acho que "a ocorrência mais próxima antes de o arquivo de entrada ter sido escrito" é um palpite sensato.

Prova de conceito rapidamente reunida:

#!/usr/bin/perl
use strict;
use Time::ParseDate;

sub extracttimestamp
{
        my $line = shift;
        my $referencepoint = shift;

        if ($line =~ /^(?:\S+\s+){5}(\S+\s+\S+\s+\S+)\s+/)
        {
                return parsedate($1, NOW => $referencepoint, PREFER_PAST => 1);
        }

        print "FAILED TO PARSE $line\n";
        return -1;
}

my $filename = $ARGV[0];
my $mtime = (stat($filename))[9];

open FILE, "<$filename";
my @list = <FILE>;
close FILE;

my @sorted = sort { extracttimestamp($a, $mtime) <=> extracttimestamp($b, $mtime) } @list;

foreach my $x (@sorted)
{
        print $x;
}
    
por 04.04.2016 / 21:05