Theo thứ tự ngày được đặt hàng bởi? Chắc chắn không phải là thứ tự chữ và số.
ls -lt
sắp xếp theo thời gian sửa đổi. Nhưng tôi cần thời gian sáng tạo.
Theo thứ tự ngày được đặt hàng bởi? Chắc chắn không phải là thứ tự chữ và số.
ls -lt
sắp xếp theo thời gian sửa đổi. Nhưng tôi cần thời gian sáng tạo.
Câu trả lời:
Hầu hết các thông báo không có khái niệm về thời gian tạo tập tin. Bạn không thể thực hiện ls
in nó vì thông tin không được ghi lại. Nếu bạn cần thời gian tạo, hãy sử dụng hệ thống kiểm soát phiên bản : xác định thời gian tạo là thời gian đăng ký.
Nếu biến thể unix của bạn có thời gian tạo, hãy xem tài liệu của nó. Ví dụ: trên Mac OS X (ví dụ duy nhất tôi biết về), hãy sử dụng ls -tU
. Windows cũng lưu trữ thời gian tạo, nhưng không phải lúc nào nó cũng tiếp xúc với các cổng của tiện ích unix, ví dụ Cygwin ls
không có tùy chọn để hiển thị. Các stat
tiện ích có thể hiển thị thời gian sáng tạo, được gọi là “thời gian sinh” trong tiện ích GNU, vậy theo Cygwin bạn có thể hiển thị tập tin được sắp xếp theo thời gian sinh với stat -c '%W %n' * | sort -k1n
.
Lưu ý rằng ctime ( ls -lc
) không phải là thời gian tạo tệp , đó là thời gian thay đổi inode . Thời gian thay đổi inode được cập nhật bất cứ khi nào bất cứ điều gì về tệp thay đổi (nội dung hoặc siêu dữ liệu) ngoại trừ thời gian không được cập nhật khi tệp chỉ được đọc (ngay cả khi thời gian được cập nhật). Cụ thể, ctime luôn luôn gần đây hơn mtime (thời gian sửa đổi nội dung tệp) trừ khi mtime được đặt rõ ràng thành một ngày trong tương lai.
-U
sắp xếp theo thời gian tạo. Theo Solaris 10.x: /usr/bin/ls
không hỗ trợ -U
, /usr/ucb/ls
hỗ trợ -U
và sắp xếp theo thời gian tạo. Những kết quả này rõ ràng phụ thuộc vào hệ thống lưu trữ thông tin đó ở nơi đầu tiên.
Thật không may, stat(2)
API không cung cấp một cách để có được thời gian tạo tệp, vì nó không được yêu cầu bởi các tiêu chuẩn Unix.
Tuy nhiên, một số hệ thống tập tin, như ext4
, lưu thông tin này trong tập tin metadatas. Không có cách tiêu chuẩn nào để có được nó, nhưng có một cách ( ext
chỉ hệ thống tập tin):
debugfs -R 'stat partition/relative/path/to/file' /dev/sda1
Bạn sẽ nhận được một cái gì đó giống như đề cập crtime
( không ctime
!) Nếu bạn sử dụng 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
Lệnh này có thể mất một chút thời gian để trở lại, có thể vì nó cũng liệt kê mọi phạm vi liên quan đến tệp.
Bây giờ nếu bạn muốn đặt hàng các tệp theo ngày tạo, tôi đoán điều này không dễ dàng (cũng không đúng). Như Gilles nói, có lẽ sẽ dễ dàng hơn nếu bạn sử dụng hệ thống kiểm soát sửa đổi. Nhưng bạn có thể thử xem ext4
API ...
Tôi đã thử stat -c '%w' myfile
lệnh trên một ext4
tệp tin trên một hệ thống Ubuntu (gần đây) nhưng không thành công (nó chỉ là câu trả lời -
).
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Đây là tập lệnh Perl sử dụng câu trả lời của Totor để đạt được điều bạn muốn (nếu hệ thống tập tin của bạn là ext4).
Hoạt động trên máy chủ của tôi (Ubuntu) và máy chủ của tôi (CentOS), nhưng không được thử nghiệm ngoài điều đó, vì vậy 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 };
}
Sử dụng lệnh này ls -lct
để sắp xếp các tệp theo ngày tạo.
ctime
là thời gian thay đổi, và không tạo ra thời gian.