日期是按什么顺序排序的?当然不是字母数字顺序。

ls -lt按修改时间排序。但是我需要创造时间。

评论

另请参阅Linux上的哪些文件系统会存储创建时间?

如果文件在ext4文件系统上,那么似乎确实有一种方法可以在Linux中获得文件创建时间。请参阅:unix.stackexchange.com/a/131347/182996

#1 楼

大多数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明确设置为将来的日期。

评论


在Cygwin中,它是ls -c。 ls --help显示了-c与-l和-lt结合使用时的功能。

–亚伦·马拉斯科(Aaron D. Marasco)
2011年9月12日,下午1:37

@Aaron不,ctime不是创建时间。纯粹基于“ ctime”和“ creation”以同一字母开头的事实,这是一种常见的混淆,但是ctime和创建时间之间没有关系。我已经更新了答案,以解决这种困惑。

–吉尔斯'所以-不再是邪恶的'
2011年9月12日上午11:31

添加到@Gilles答案;我使用NFS 3.x文件服务器(不确定底层文件系统;虽然我猜是UFS,但不是UFS还是ZFS)。在Redhat 6.x下:-U按创建时间排序。在Solaris 10.x下:/ usr / bin / ls不支持-U,/ usr / ucb / ls支持-U并按创建时间排序。这些结果显然取决于首先存储该信息的文件系统。

–布莱恩·范登堡(Brian Vandenberg)
2012年6月12日19:44



@ brian-vandenberg,在RHEL7 ls -U下不排序;按目录顺序列出条目(我假设RHEL6是相同的)。那不是文件创建的时间。

–富兰克林·皮亚特
15年3月27日在21:14

@FranklinPiat,在这里选择一个单元,但是如果没有文件从该目录取消链接,则可能是创建顺序。顺便说一下,在FreeBSD中(以及扩展名OSX),ls -f将列出未排序的目录内容。

–ghoti
16年2月12日在11:30

#2 楼

不幸的是,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

此命令可能需要一些时间才能返回,可能是因为它还列出了与文件相关的每个范围。
现在,如果要按创建日期对文件进行排序,我想这并不容易(也不正确)可能。正如Gilles所说,如果使用修订控制系统,可能会更容易。但是您可以尝试看看ext4 API ...
我在足够近的Ubuntu系统上的stat -c '%w' myfile文件系统上尝试了ext4命令,但没有成功(它只能回答-)。

UPDATE:从Linux内核4.11开始,引入了新的statx(2)系统调用。如果信息在文件系统上可用,则其API可以访问文件创建时间。据我所知,尚无标准/稳定的用户空间实用程序可让我们获取此信息,但它可能会在一段时间后出现。 man说,虽然这不是标准的POSIX接口,但它是Linux专用的:

statx()是Linux特定的。


评论


如果有人想要一个衬板:f ='/ path / to / file'; debugfs -R“ stat $ f” $(df $ f |(读a;读a b;回显“ $ a”))| grep crtime

– oop
18 Mar 27 '18在11:37

#3 楼

在运行内核4.11或更高版本,glibc 2.28或更高版本以及coreutils 8.31或更高版本的Linux系统上,stat可以在存储文件的文件系统上显示文件的诞生时间。可以使用
stat -c "%A %4h %U %G %10s %.16w %n" -- *

获得与ls -l类似的输出,并使用
stat -c "%.10W %A %4h %U %G %10s %.16w %n" -- * |
  sort -k1,1n |
  cut -d' ' -f2-

获得排序后的输出(假设没有带换行符的文件名)使用coreutils 8.32或更高版本,可以显示和显示使用生日时间排序,使用ls选项:
ls -l --time=birth

上面的--time=birth调用使用以下格式选项:


stat:生日,自Unix纪元(含10位小数部分)。

%.10W:文件类型和权限,格式为%A

ls -l:指向文件的硬链接数,对齐四个字符

%4h:拥有用户的名称

%U:拥有组的名称

%G:文件大小,对齐十个字符

%10s:以人类可读的格式出生的时间,被截断为16个字符(足以显示年,月,日,时,分和秒)

%.16w :吨他的文件名


评论


在大型目录上,这相当快!

–user239558
20 Mar 6 '20 at 21:03

另请参阅ls -l --time = birth或--time = creation与GNU ls 8.32或更高版本(发布该答案后3周发布)

–StéphaneChazelas
1月4日7:48



感谢@Stéphane,我已将其添加到答案中!

–斯蒂芬·基特(Stephen Kitt)
1月4日7:57

#4 楼

[编辑]
使用此命令ls -lct按照ctime(文件状态信息的最后修改时间)对文件进行排序。

评论


yup不是“正确”命令,而是大多数情况下要查找的内容

– madnight
18年2月16日在20:25



有没有办法用“查找”来做到这一点,以便它以这种方式打印子目录中的所有文件?

–科林D
19年5月1日19:40

ctime是更改时间,而不是创建时间。

– Nabi K.A.Z.
19-09-23在10:38

足够公平为我工作。

– Smeterlink
20年5月7日在17:39

#5 楼

这是一个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 = ;

    # 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   => ,
        month  => $months{},
        day    => ,
        hour   => ,
        minute => ,
        second => ,
    );

    # 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)
17年1月24日在20:48

在此有很多警告/错误。.在sort-by-create-time.pl第43行中,在模式匹配(m //)中使用未初始化的值$ datestring。在按sort-by-create的哈希元素中使用未初始化的值$ 1 -time.pl第48行。在/usr/lib/x86_64-linux-gnu/perl5/5.22/DateTime.pm的子例程条目中使用未初始化的值在第197行。@DB :: args中未初始化的值在列表分配中的使用/usr/share/perl/5.22/Carp.pm第228行。DateTime :: new的'minute'参数(undef)是'undef'...

–user239558
20 Mar 6 '20 at 21:01

#6 楼

要在shell中执行。
不提供创建时间,而是更改时间。
如果分区为ext4,则只有debugfs可以显示创建时间。

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

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