Como eu faço um ls e depois classifico os resultados por data criada?

101

Em que ordem os dados são ordenados por? Certamente não ordem alfanumérica.

ls -lt classifica por tempo de modificação. Mas preciso de tempo de criação.

    
por InquilineKea 10.09.2011 / 23:08

5 respostas

85

A maioria dos unices não tem um conceito de tempo de criação de arquivos. Você não pode fazer ls imprimi-lo porque as informações não são gravadas. Se você precisar de tempo de criação, use um sistema de controle de versão : defina o horário de criação como o horário do check-in.

Se sua variante unix tiver um tempo de criação, examine sua documentação. Por exemplo, em Mac OS X (o apenas o exemplo que conheço ¹, use ls -tU . O Windows também armazena um tempo de criação, mas nem sempre é exposto a portas de utilitários unix, por exemplo, Cygwin ls não tem uma opção para mostrá-lo. O utilitário stat pode mostrar a hora da criação, chamada "horário de nascimento" nos utilitários GNU, então, sob o Cygwin, você pode mostrar arquivos classificados por hora de nascimento com stat -c '%W %n' * | sort -k1n .

Observe que o ctime ( ls -lc ) não é o tempo de criação do arquivo , é o inode muda o tempo. O tempo de alteração do inode é atualizado sempre que algo sobre o arquivo é alterado (conteúdo ou metadados), exceto que o ctime não é atualizado quando o arquivo é meramente lido (mesmo que o atime seja atualizado). Em particular, a ctime é sempre mais recente que o mtime (tempo de modificação do conteúdo do arquivo), a menos que o mtime tenha sido explicitamente definido para uma data futura.

    
por 10.09.2011 / 23:42
14

Infelizmente, a stat(2) API não fornece uma maneira de obter o horário de criação do arquivo, pois é não é necessário pelos padrões Unix.

No entanto, alguns sistemas de arquivos, como ext4 , salvam essas informações nos metadados do arquivo. Não existe uma maneira padrão de obtê-lo, mas existe uma maneira ( ext filesystems apenas):

debugfs -R 'stat partition/relative/path/to/file' /dev/sda1

Você obteria algo assim mencionando crtime ( não ctime !) se você usasse ext4 .

 ctime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
 atime: 0x513dd8f1:04df0b20 -- Mon Mar 11 14:15:29 2013
 mtime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
crtime: 0x513a259a:35191a3c -- Fri Mar  8 18:53:30 2013

Esse comando pode levar algum tempo para retornar, provavelmente porque também lista todas as extensões relacionadas ao arquivo.

Agora, se você quiser ordenar arquivos por data de criação, eu acho que isso não é fácil (nem corretamente) possível. Como diz Gilles , provavelmente seria mais fácil se você usasse um sistema de controle de revisão. Mas você pode tentar dar uma olhada na ext4 API ...

Eu tentei o comando stat -c '%w' myfile em um ext4 filesytem em um sistema Ubuntu (recente o suficiente) sem sucesso (ele apenas responde - ).

    
por 14.03.2013 / 10:24
1

Aqui está um script Perl que usa a resposta do Totor para conseguir o que você quer (se o seu sistema de arquivos é ext4).

Funciona na minha máquina doméstica (Ubuntu) e no meu servidor (CentOS), mas não é testado além disso, então ymmv.

#!/usr/bin/env perl

use Modern::Perl '2009';

use DateTime;


# Open the current directory for reading
opendir my $dh, "." or die "Unable to open directory: $!";

# Create a hash to save results into
my %results;
my %datestamp;

# Loop through the directory getting creation date stats for each file
while ( my $filename = readdir $dh ) {
    # Skip non-files
    next if $filename eq '.' or $filename eq '..';

    # Save the ls output for this file/directory
    $results{ $filename } = 'ls -ld $filename';

    my $stats = 'debugfs -R 'stat $filename' /dev/sda6 2>/dev/null';
    # crtime: 0x51cd731c:926999ec -- Fri Jun 28 12:27:24 2013
    $stats =~ m/crtime\: \w+\:\w+ -- (.+?)\n/s;
    my $datestring = $1;

    # Dissect date with a regexp, ick
    my %months = (
        'Jan' => '1',
        'Feb' => '2',
        'Mar' => '3',
        'Apr' => '4',
        'May' => '5',
        'Jun' => '6',
        'Jul' => '7',
        'Aug' => '8',
        'Sep' => '9',
        'Oct' => '10',
        'Nov' => '11',
        'Dec' => '12',
    );
    $datestring =~ m/\w+ (\w+)  ?(\d+) (\d\d)\:(\d\d)\:(\d\d) (\d\d\d\d)/;

    # Convert date into a more useful format
    my $dt = DateTime->new(
        year   => $6,
        month  => $months{$1},
        day    => $2,
        hour   => $3,
        minute => $4,
        second => $5,
    );

    # Save the datestamp for this result
    $datestamp{ $filename } = $dt->iso8601;
}

# Output in date order
my @filenames = sort { $datestamp{$a} gt $datestamp{$b} } keys %datestamp;

foreach my $filename ( @filenames ) {
    print $results{ $filename };
}
    
por 03.03.2016 / 12:37
-1

Use este comando ls -lct para classificar arquivos de acordo com a data de criação.

    
por 04.04.2017 / 14:43
-3

-tc classifica os arquivos com base no tempo de criação. O arquivo mais antigo no diretório aparecerá na parte inferior e o mais novo na parte superior.

    
por 08.12.2016 / 07:18