日期是按什么顺序排序的?当然不是字母数字顺序。
ls -lt
按修改时间排序。但是我需要创造时间。
日期是按什么顺序排序的?当然不是字母数字顺序。
ls -lt
按修改时间排序。但是我需要创造时间。
Answers:
大多数unice没有文件创建时间的概念。您无法进行ls
打印,因为未记录信息。如果需要创建时间,请使用版本控制系统:将创建时间定义为签入时间。
如果您的Unix变体有创建时间,请查看其文档。例如,在Mac OS X(我知道的唯一示例¹)中,使用ls -tU
。Windows还存储了创建时间,但是它并不总是暴露于unix实用程序的端口,例如Cygwin ls
没有显示它的选项。该stat
实用程序可以显示创建时间,在GNU实用程序中称为“出生时间”,因此在Cygwin下,您可以使用来显示按出生时间排序的文件stat -c '%W %n' * | sort -k1n
。
请注意,ctime(ls -lc
)不是文件创建时间,而是inode更改时间。每当有关文件的任何内容(内容或元数据)发生任何更改(除了仅在读取文件时ctime不会更新(即使atime已更新))时,inode更改时间都会更新。特别是,ctime总是比mtime(文件内容修改时间)更新,除非将mtime明确地设置为将来的日期。
-U
按创建时间排序。在Solaris 10.x中:/usr/bin/ls
不支持-U
,/usr/ucb/ls
支持-U
和创建时间排序呢。这些结果显然取决于首先存储该信息的文件系统。
不幸的是,stat(2)
API没有提供获取文件创建时间的方法,因为Unix标准并不需要。
但是,某些文件系统as 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
该命令可能需要一些时间才能返回,这可能是因为它还列出了与文件相关的每个扩展区。
现在,如果您想按创建日期排序文件,我想这是不容易的(也不正确的)。正如Gilles所说,如果使用修订控制系统,可能会更容易。但是您可以尝试看看ext4
API ...
我在(足够近的)Ubuntu系统stat -c '%w' myfile
上的ext4
文件系统上尝试了该命令,但未成功(仅回答-
)。
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
这是一个Perl脚本,它使用Totor的答案来实现所需的内容(如果文件系统是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 };
}