ls -lt
按修改时间排序。但是我需要创造时间。#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
评论
另请参阅Linux上的哪些文件系统会存储创建时间?如果文件在ext4文件系统上,那么似乎确实有一种方法可以在Linux中获得文件创建时间。请参阅:unix.stackexchange.com/a/131347/182996