날짜는 어떤 순서로 주문됩니까? 확실히 영숫자 순서가 아닙니다.
ls -lt
수정 시간별로 정렬합니다. 그러나 나는 창조 시간이 필요하다.
날짜는 어떤 순서로 주문됩니까? 확실히 영숫자 순서가 아닙니다.
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 (파일 내용 수정 시간)보다 최신입니다.
-U
생성 시간을 기준으로 정렬합니다. Solaris 10.x에서 : /usr/bin/ls
지원 안 함 -U
, /usr/ucb/ls
지원 -U
시간 및 생성 시간별로 정렬합니다. 이러한 결과는 해당 정보를 처음에 저장하는 파일 시스템에 따라 다릅니다.
불행히도 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
이 명령은 파일과 관련된 모든 범위를 나열하기 때문에 리턴하는 데 시간이 걸릴 수 있습니다.
생성 날짜별로 파일 을 주문하려면 이것이 쉽지 않을 수도 있습니다. 으로 질이 말한다 당신은 버전 관리 시스템을 사용하려는 경우, 아마 쉬울 것입니다. 그러나 ext4
API를 보려고 할 수도 있습니다 ...
나는 (최근에 충분한) 우분투 시스템 stat -c '%w' myfile
의 ext4
파일 시스템에서 명령을 시도했지만 성공하지 못했습니다 -
.
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
다음은 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 };
}