[unix] ls를 수행 한 다음 생성 된 날짜별로 결과를 정렬하려면 어떻게합니까?

날짜는 어떤 순서로 주문됩니까? 확실히 영숫자 순서가 아닙니다.

ls -lt수정 시간별로 정렬합니다. 그러나 나는 창조 시간이 필요하다.



답변

대부분의 유니스는 파일 생성 시간 개념이 없습니다. ls정보가 기록되지 않아 인쇄 할 수 없습니다 . 작성 시간이 필요한 경우 버전 제어 시스템을 사용하십시오 . 작성 시간을 체크인 시간으로 정의하십시오.

유닉스 변형에 생성 시간이 있으면 해당 설명서를 참조하십시오. 예를 들어, Mac OS X (내가 알고있는 유일한 예 ¹)에서는을 사용하십시오 ls -tU. Windows는 생성 시간도 저장하지만 유닉스 유틸리티 포트에 항상 노출되는 ls것은 아닙니다 ( 예 : Cygwin은이 를 표시 할 수있는 옵션이 없음). 이 stat유틸리티는 GNU 유틸리티에서 “출생 시간”이라고하는 생성 시간을 표시 할 수 있으므로 Cygwin에서 파일을 출생 시간별로 정렬하여 표시 할 수 있습니다 stat -c '%W %n' * | sort -k1n.

참고 ctime이가 ( ls -lc) 파일 생성 시간이 아니다 , 그것은의 아이 노드 변경 시간. inode 변경 시간은 파일을 읽을 때 (한 번 업데이트하더라도) ctime이 업데이트되지 않는다는 점을 제외하고 파일에 대한 내용 (내용 또는 메타 데이터)이 변경 될 때마다 업데이트됩니다. 특히, mtime이 명시 적으로 날짜로 설정되지 않은 경우 ctime은 항상 mtime (파일 내용 수정 시간)보다 최신입니다.


답변

불행히도 stat(2)API는 Unix 표준에 필요하지 않으므로 파일 작성 시간을 얻는 방법을 제공하지 않습니다 .

그러나 일부 파일 시스템 ext4은이 정보를 파일 메타 데이터 내에 저장합니다. 그것을 얻는 표준 방법은 없지만 방법이 있습니다 ( ext파일 시스템 만 해당).

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

당신은 언급 할 뭔가를 얻을 것 crtime( 하지 ctime !) 당신이 사용하는 경우 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

이 명령은 파일과 관련된 모든 범위를 나열하기 때문에 리턴하는 데 시간이 걸릴 수 있습니다.

생성 날짜별로 파일 을 주문하려면 이것이 쉽지 않을 수도 있습니다. 으로 질이 말한다 당신은 버전 관리 시스템을 사용하려는 경우, 아마 쉬울 것입니다. 그러나 ext4API를 보려고 할 수도 있습니다 …

나는 (최근에 충분한) 우분투 시스템 stat -c '%w' myfileext4파일 시스템에서 명령을 시도했지만 성공하지 못했습니다 -.


답변

다음은 Totor의 답변을 사용하여 원하는 것을 달성하는 Perl 스크립트입니다 (파일 시스템이 ext4 인 경우).

내 가정용 컴퓨터 (Ubuntu)와 서버 (CentOS)에서 작동하지만 그 이상으로 테스트되지 않았으므로 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 };
}


답변

ls -lct작성 날짜에 따라 파일을 정렬 하려면이 명령 을 사용하십시오 .


답변