Làm thế nào để tôi làm một ls và sau đó sắp xếp kết quả theo ngày được tạo?


112

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 -ltsắp xếp theo thời gian sửa đổi. Nhưng tôi cần thời gian sáng tạo.



1
không dường như là một cách để có được thời gian tạo tập tin trong Linux nếu tập tin trên một hệ thống tập tin ext4. Xem: unix.stackexchange.com/a/131347/182996
kaartic

Câu trả lời:


94

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 lsin 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 lskhông có tùy chọn để hiển thị. Các stattiệ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.


1
Trong Cygwin nó là ls -c. ls --helpcho thấy những gì -clàm khi kết hợp với -l-lt.
Aaron D. Marasco

6
@Aaron Không, ctime không phải là thời gian sáng tạo. Đó là một sự nhầm lẫn phổ biến hoàn toàn dựa trên thực tế là việc tạo ra thời gian và thời gian sáng tạo và bắt đầu với cùng một chữ cái, nhưng không có mối quan hệ nào giữa thời gian và thời gian sáng tạo. Tôi đã cập nhật câu trả lời của mình để giải quyết sự nhầm lẫn này.
Gilles

LOL xấu của tôi. Tôi đã cố gắng xác nhận phần Cygwin cho ya (IIRC bài viết gốc của bạn có một lệnh có thể). Nó đặc biệt nói "ctime (thời gian sửa đổi cuối cùng của thông tin trạng thái tệp)" nếu tôi đã chú ý.
Aaron D. Marasco

Thêm vào câu trả lời @Gilles; Tôi sử dụng máy chủ tệp NFS 3.x (không chắc chắn về hệ thống tệp cơ bản; đó là UFS hoặc ZFS, mặc dù tôi đoán là UFS). Theo Redhat 6.x: -Usắp xếp theo thời gian tạo. Theo Solaris 10.x: /usr/bin/lskhông hỗ trợ -U, /usr/ucb/lshỗ trợ -Uvà 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.
Brian Vandenberg

1
@ghoti Nếu không có tệp nào bị xóa (hoặc di chuyển / đổi tên / hardlinked / mật) trong thư mục, thì thứ tự thư mục là thứ tự tạo trên một số hệ thống tệp, nhưng không phải tất cả. Điều đó không đúng trên ext4, ví dụ. Tôi không biết điều đó có đúng trên UFS của Solaris không.
Gilles

16

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 ( extchỉ 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 ext4API ...

Tôi đã thử stat -c '%w' myfilelệnh trên một ext4tệ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 -).


Nếu bất cứ ai muốn có một lớp lót:f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Boop

3

Đâ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 };
}

Cũng tốt để đề cập rằng một số tệp có thể có siêu dữ liệu (chẳng hạn như exif) ghi lại ngày / giờ tạo. Nếu tất cả các tệp của bạn là ảnh kỹ thuật số chẳng hạn, rất có thể bạn có dữ liệu này. Dưới đây là một ví dụ sử dụng Image :: ExifTool của perl .
Jonathan Cross

0

Sử dụng lệnh này ls -lctđể sắp xếp các tệp theo ngày tạo.


2
yup đó không phải là lệnh "chính xác", nhưng đó là những gì bạn đang tìm kiếm trong hầu hết các trường hợp
madnight

Có cách nào để làm điều này với "find" để nó in tất cả các tệp trong thư mục con theo cách này không?
Colin D

Các ctimelà thời gian thay đổi, và không tạo ra thời gian.
Nabi KAZ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.