Як зробити ls, а потім сортувати результати за створеною датою?


112

У якому порядку впорядковані дати? Безумовно, не буквено-цифровий порядок.

ls -ltсортування за часом модифікації. Але мені потрібен час на створення.



1
Там же , як видається, спосіб отримання часу створення файлу в Linux , якщо файл знаходиться на ext4 файлової системи. Дивіться: unix.stackexchange.com/a/131347/182996
kaartic

Відповіді:


94

Більшість уніцій не мають концепції часу створення файлів. Ви не можете lsйого надрукувати, оскільки інформація не записується. Якщо вам потрібен час створення, використовуйте систему контролю версій : визначте час створення як час реєстрації.

Якщо ваш варіант Unix має час створення, подивіться його документацію. Наприклад, на Mac OS X (єдиний я відомий приклад example) використовуйте ls -tU. Windows також зберігає час створення, але він не завжди піддається порту unix-утиліт, наприклад, Cygwin lsне має можливості його показувати. statУтиліта може показати час створення, зване «час народження» в GNU утиліти, так що під Cygwin ви можете показати файли , відсортовані за часом народження з stat -c '%W %n' * | sort -k1n.

Зауважте, що ctime ( ls -lc) - не час створення файлу , це час зміни inode . Час зміни inode оновлюється щоразу, коли щось про файл змінюється (вміст або метадані), за винятком того, що ctime не оновлюється, коли файл просто читається (навіть якщо оновлення atime оновлено). Зокрема, ctime завжди пізніший за mtime (час зміни вмісту файлу), якщо mtime явно не встановлено дату в майбутньому.


1
У Cygwin це так ls -c. ls --helpпоказує, що -cробить у поєднанні з -lта -lt.
Аарон Д. Мараско

6
@Aaron Ні, ctime - це не час створення. Це звичайна плутанина, заснована виключно на тому, що "ctime" і "create" починаються з однієї і тієї ж літери, але немає зв'язку між ctime і часом створення. Я оновив свою відповідь, щоб вирішити цю плутанину.
Жиль

LOL моя погана. Я намагався підтвердити частину Cygwin для ya (IIRC у вашому початковому дописі була можлива команда). Він спеціально говорить "ctime (час останньої модифікації інформації про файл)", якби я звернув увагу.
Аарон Д. Мараско

Додавання до відповіді @Gilles; Я використовую файловий сервер NFS 3.x (не впевнений у базовій файловій системі; це або UFS, або ZFS, хоча я думаю, що UFS). Під Redhat 6.x: -Uсортування за часом створення. У програмі Solaris 10.x: /usr/bin/lsне підтримує -U, /usr/ucb/lsпідтримує -Uта сортує за часом створення. Ці результати очевидно залежать від файлової системи, яка зберігає цю інформацію в першу чергу.
Брайан Ванденберг

1
@ghoti Якщо жодні файли ніколи не були видалені (або переміщені / перейменовані / жорсткі посилання /…) у каталозі, то порядок створення каталогу - це порядок створення в деяких файлових системах, але не у всіх. Наприклад, це не вірно для ext4. Я не знаю, чи це правда в UFS Solaris.
Жиль

16

На жаль, 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

Ця команда може зайняти деякий час для повернення, ймовірно, тому що вона також перераховує всі міри, пов'язані з файлом.

Тепер, якщо ви хочете замовити файли за датою створення, я думаю, це не легко (ані належним чином) можливо. Як каже Гілльз , було б, мабуть, простіше, якби ви використовували систему контролю ревізії. Але ви можете спробувати переглянути ext4API ...

Я пробував stat -c '%w' myfileкоманду на ext4файловому файлі в (досить недавній) системі Ubuntu без успіху (вона просто відповідає -).


Якщо хтось хоче один лайнер:f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Буп

3

Ось сценарій Perl, який використовує відповідь Тотора для досягнення того, що ви хочете (якщо ваша файлова система 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 };
}

Також добре зазначити, що деякі файли можуть мати метадані (наприклад, exif), які записують дату / час створення. Якщо, наприклад, усі ваші файли є цифровими фотографіями, ви, швидше за все, маєте ці дані. Ось приклад використання Perl's Image :: ExifTool .
Джонатан Крос

0

Використовуйте цю команду ls -lctдля сортування файлів за датою створення.


2
Так, це не "правильна" команда, але це те, що ви шукаєте в більшості випадків
понеділок

чи є спосіб це зробити за допомогою "find", щоб він друкував усі файли у підкаталогах таким чином?
Колін Д

ctimeЧас зміни, а не створювати час.
Набі КАЗ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.