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


112

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

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



1
이 않는 파일이 ext4 파일 시스템에있는 경우 리눅스의 파일 생성 시간을 얻을 수있는 방법이 될 것으로 보인다. 참조 : unix.stackexchange.com/a/131347/182996
— kaartic

답변:


94

대부분의 유니스는 파일 생성 시간 개념이 없습니다. 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 (파일 내용 수정 시간)보다 최신입니다.


1
에서 Cygwin에서 그 것이다 ls -c. and와 결합하면 수행 할 작업을 ls --help보여줍니다 . -c-l-lt
— Aaron D. Marasco

6
@Aaron 아니요, ctime은 생성 시간이 아닙니다. “ctime”과“creation”이 같은 문자로 시작한다는 사실에 기반한 일반적인 혼동이지만 ctime과 생성 시간 사이에는 아무런 관계가 없습니다. 이 혼란을 해결하기 위해 답변을 업데이트했습니다.
— Gilles

내 잘못이야. 나중에 Cygwin 부분을 확인하려고했습니다 (IIRC 원본 게시물에 가능한 명령이 있음). 주의를 기울 였다면, 구체적으로는 「ctime (파일 상태 정보의 최종 수정 시간)」이라고되어 ​​있습니다.
— Aaron D. Marasco

@Gilles 답변에 추가; NFS 3.x 파일 서버를 사용합니다 (기본 파일 시스템은 확실하지 않습니다. UFS는 추측하지만 UFS 또는 ZFS입니다). Redhat 6.x에서 : -U생성 시간을 기준으로 정렬합니다. Solaris 10.x에서 : /usr/bin/ls지원 안 함 -U, /usr/ucb/ls지원 -U시간 및 생성 시간별로 정렬합니다. 이러한 결과는 해당 정보를 처음에 저장하는 파일 시스템에 따라 다릅니다.
— Brian Vandenberg

1
@ghoti 디렉토리에서 파일이 삭제되지 않았거나 (이동 / 재 명명 / 하드 링크 된 / ...) 디렉토리 순서는 일부 파일 시스템에서 생성 순서이지만 전부는 아닙니다. 예를 들어 ext4에서는 그렇지 않습니다. 솔라리스의 UFS에서 이것이 사실인지 모르겠습니다.
— Gilles

16

불행히도 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' myfile의 ext4파일 시스템에서 명령을 시도했지만 성공하지 못했습니다 -.


누군가가 하나의 라이너를 원한다면 :f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
— Boop

3

다음은 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 };
}

또한 일부 파일에는 생성 날짜 / 시간을 기록하는 메타 데이터 (예 : exif)가있을 수 있습니다. 예를 들어 모든 파일이 디지털 사진 인 경우이 데이터가있을 가능성이 큽니다. 다음은 perl의 Image :: ExifTool을 사용 하는 예 입니다.
— Jonathan Cross

0

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


2
넵 즉, "올바른"명령은 아니지만, 당신은 대부분의 경우에 무엇을 찾고있다
— madnight

"find"로 이것을 수행하여 하위 디렉토리의 모든 파일을 이런 식으로 인쇄하는 방법이 있습니까?
— 콜린 D

는 ctime변경 시간이며, 시간을 만들 수 없습니다.
— Nabi KAZ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.