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

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

날짜는 어떤 순서로 정렬되나요? 물론 영숫자 순서는 아닙니다.

ls -lt수정 시간별로 정렬합니다. 하지만 창의적인 시간이 필요해요.

답변1

대부분의 유닉스에는 파일 생성 시간에 대한 개념이 없습니다. ls정보가 기록되지 않아 인쇄할 수 없습니다. 생성 시간이 필요한 경우버전 관리 시스템: 생성시간을 체크인 시간으로 정의합니다.

UNIX 변형에 생성 날짜가 있는 경우 해당 설명서를 확인하세요. 예를 들어,맥 OS X(내가 아는 유일한 예) ls -tU.Windows를 사용하면 생성 시간도 저장되지만 유닉스 유틸리티 포트에 항상 노출되는 것은 아닙니다. 예를 들어 Cygwin에는 ls이를 표시하는 옵션이 없습니다. 이 stat유틸리티는 GNU 유틸리티에서 "생성 시간"이라는 생성 시간을 표시할 수 있으므로 Cygwin에서는 stat -c '%W %n' * | sort -k1n.

알아채다시간( ls -lc)파일 생성 시간이 아님,이것은인덱스 노드시간을 변경하세요. 파일(콘텐츠 또는 메타데이터)에 변경 사항이 있을 때마다 inode 변경 시간이 업데이트되지만 파일을 읽기만 하면 ctime은 업데이트되지 않습니다(atime이 업데이트되더라도). 특히 mtime이 명시적으로 미래 날짜로 설정되지 않는 한 ctime은 항상 mtime(파일 내용이 수정된 시간)보다 최신입니다.

답변2

아쉽게도 stat(2)API는 파일 생성 시간을 얻을 수 있는 방법을 제공하지 않습니다.불필요한유닉스 표준에 따르면.

그러나 일부 파일 시스템(예: ext4또는 XFS)에서는 이 정보를 파일 메타데이터에 보관합니다.그것을 얻는 표준적인 방법은 없지만 방법은 있습니다:

참고: 이 답변은 주로 Linux 시스템과 관련이 있습니다.

업데이트 2021: 새로운 ls명령 옵션

~에 따르면스티븐 차제라스, lscoreutils 8.32 버전(glibc 2.28 및 커널 4.11 포함)은 이제 새로운 statx(2)시스템 호출(이 답변의 끝 참조)을 사용하여 생성 시간 메타데이터를 추출할 수 있습니다.

그래서 파일을 나열하려면정렬됨생성/생년월일/시간에 따라 다음을 사용할 수 있습니다.

ls -lt --time=birth

-t옵션은 옵션에 표시된 시간 유형별로 정렬됩니다 --time(I의심하다 birth원한다면 변경할 수 있습니다 creation.)

-r정렬 순서를 반대로 하기 위해 추가되었습니다 .

debugfsextN파일 시스템 의 경우

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

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

VCS를 사용하시나요?

이제 당신이 원한다면주문하다파일은 생성 날짜별로 정렬되어 있는데, 달성하기가 쉽지도 정확하지도 않은 것 같습니다. ~처럼자일스버전 제어 시스템을 사용하면 더 쉬울 수도 있습니다. 하지만 ext4API를 시도해 볼 수는 있습니다 .

사령부 stat(2021년 업데이트)

(최근) Ubuntu 시스템의 파일 시스템에서 명령을 시도했지만 stat -c '%w' myfile성공하지 못했습니다(방금 응답했습니다).ext4-

2021년 업데이트:~에 따르면토마스 니만, 위 명령은 최소한 coreutils 8.31, glibc 2.28 및 커널 4.11이 있는 경우 Linux에서 작동합니다. 다음을 시도해 볼 수는 있지만 파일 자체는 정렬되지 않습니다.

stat -c '%w %n' * | sort -n 

이를 달성하기 위해. %W사람이 읽을 수 있는 날짜에 관심이 없는 경우 사용하세요. 역순 -r으로 하는 옵션이 추가되었습니다 .sort


2020 업데이트: Linux 기준커널 4.11, 새로운 statx(2)시스템 호출소개되었습니다. 해당 API는 파일 시스템에서 정보를 사용할 수 있는 경우 파일 생성 시간에 액세스할 수 있습니다. 내가 아는 한, 이 정보를 얻을 수 있는 표준/안정적인 사용자 공간 유틸리티는 없지만 언젠가는 나올 수 있습니다. 이것은 표준 POSIX 인터페이스가 아니라 Linux 전용 인터페이스입니다.이것man:

statx()는 Linux 커널 4.11에 추가되었으며 라이브러리 지원은 glibc 2.28에 추가되었습니다.

statx()는 Linux에만 해당됩니다.

답변3

커널 4.11 이상, glibc 2.28 이상을 실행하는 Linux 시스템에서coreutils 8.31 이상, stat파일이 저장된 파일 시스템의 파일 생성 시간을 표시합니다. ls -l이와 유사한 출력은 다음과 같이 얻을 수 있습니다.

stat -c "%A %4h %U %G %10s %.16w %n" -- *

및 정렬된 출력(개행 문자가 있는 파일 이름이 없다고 가정)

stat -c "%.10W %A %4h %U %G %10s %.16w %n" -- * |
  sort -k1,1n |
  cut -d' ' -f2-

그리고coreutils 8.32 이상, 다음 옵션을 ls사용하여 출생 시간을 기준으로 표시하고 정렬할 수 있습니다 .--time=birth

ls -l --time=birth

위의 호출 stat이러한 서식 옵션:

  • %.10W: 출생 시간, Unix 시대 이후의 초(소수점 10자리).
  • %A: 파일 형식 및 권한, ls -l형식
  • %4h: 4자로 정렬된 파일에 대한 하드 링크 수
  • %U: 그것이 속한 사용자의 이름
  • %G: 소속된 그룹의 이름
  • %10s: 파일 크기, 10자로 정렬
  • %.16w: 생년월일, 사람이 읽을 수 있는 형식, 16자로 잘림(연도, 월, 일, 시, 분, 초를 표시하기에 충분함)
  • %n: 파일 이름

답변4

다음은 원하는 것을 달성하기 위해 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 };
}

관련 정보