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


누군가가 하나의 라이너를 원한다면 :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.