it-swarm.dev

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

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

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

124
InquilineKea

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

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

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

불행히도, stat(2) API는 파일 생성 시간을 얻는 방법을 제공하지 않습니다. Unix 표준에 의해 필요하지 않음 이기 때문입니다.

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

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

ext4를 사용하면 crtime (notctime!)를 언급하는 것과 같은 것을 얻을 수 있습니다.

 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

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

이제 생성 날짜별로 파일을 order하려는 경우 이것이 쉽지는 않습니다. Gilles이 말했듯이 개정 제어 시스템을 사용하면 더 쉬울 것입니다. 그러나 ext4 API를 보려고 시도 할 수 있습니다 ...

우분투 시스템에서 stat -c '%w' myfile 파일 시스템에서 ext4 명령을 시도하지 않고 성공했습니다 (-라고 답합니다).

17
Totor

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

이 명령을 사용하십시오 ls -lct 생성 날짜별로 파일을 정렬합니다.

2
Rohit Gaikwad

커널 4.11 이상을 glibc 2.28 이상으로 실행하고 coreutils 8.31 이상stat를 실행하는 Linux 시스템에서 파일의 저장 시간을 파일 시스템에 표시 할 수 있습니다. ls -l와 비슷한 출력을 얻을 수 있습니다.

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

정렬 된 출력

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

이러한 형식 지정 옵션 을 사용합니다.

  • %W : 유닉스 시대 이후 초 단위의 출생 시간
  • %A : 파일 유형 및 권한 (ls -l 형식)
  • %4h : 파일에 대한 하드 링크 수 (4 문자로 정렬)
  • %U : 소유 한 사용자 이름
  • %G : 소유 그룹 이름
  • %10s : 파일 크기, 10 자로 정렬
  • %.16w : 사람이 읽을 수있는 형식의 출생 시간이 16 자로 잘립니다 (년, 월, 일,시, 분 및 초를 표시하기에 충분 함)
  • %n : 파일 이름
1
Stephen Kitt

셸에서 수행하십시오. ls는 작성 시간을 제공하지 않고 시간을 변경합니다. 파티션이 ext4 인 경우 debugfs 만 작성 시간을 표시 할 수 있습니다.

disk=$(df -Th . | grep ext4  |awk '{print $1}')
for file in "."/*
do
    inode=$(ls -i $file | awk '{print $1}')
    crtime=$(debugfs -R "stat <$inode>" $disk 2>/dev/null | grep crtime |  awk -F'-- ' '{print $2}' | awk '{print $2,$3,$5,$4}')

    printf "$crtime\t$file\n"
done | sort -k4 | sort -n -k 3 -k 1M -k2 -k4
0
luigi9876