Как я делаю ls и затем сортирую результаты, по дате созданные?

Вы могли установить apt-cacher-ng на запасной машине для действия как прокси/кэш для всех хостов. Можно вынудить конфигурацию только использовать определенные хосты или использовать прием/etc/hosts, предложенный @badp на той одной машине.

apt-get install apt-cacher-ng

После того как у Вас есть установка apt-cache-ng, просто необходимо отбросить следующую строку (с IP-адресом / имя хоста, измененное для указания на машину ловца) в/etc/apt/apt.conf.d/90httpproxy

Acquire::http { Proxy "http://[192.168.1.254]:3142"; };

Я использую ту установку для сокращения использования пропускной способности, но это должно обходное решение проблема. К сожалению, я не знаю о способе непосредственно отключить ipv6 поиски для Кв. - вовлекают себя.

117
31.03.2014, 19:23
6 ответов

Большинство нельдов не имеет понятия времени создания файла. Вы не можете сделать ls распечатайте его, потому что информация не зарегистрирована. При необходимости во времени создания используйте систему управления версиями: определите время создания как время регистрации.

Если Ваш вариант Unix имеет время создания, посмотрите на его документацию. Например, на   Mac OS X (единственный пример я знаю о ¹), использовать 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 не был явно установлен на дату в будущем.

95
27.01.2020, 19:29
  • 1
    В Cygwin это ls -c. ls --help шоу, что -c делает в сочетании с -l и -lt. –  Aaron D. Marasco 12.09.2011, 04:37
  • 2
    @Aaron нет, ctime не является временем создания. Это - общий беспорядок, базирующийся просто на том, что “ctime” и “создание” запускаются с той же буквы, но нет никакого отношения между временем создания и ctime. Я обновил свой ответ для обращения к этому беспорядку. –  Gilles 'SO- stop being evil' 12.09.2011, 14:31
  • 3
    LOL мое плохое. Я пытался подтвердить часть Cygwin для Вас (IIRC, Ваше исходное сообщение имело возможную команду). Это действительно конкретно говорит "ctime (время последнего изменения информации о статусе файла)", если я обратил внимание. –  Aaron D. Marasco 13.09.2011, 05:02
  • 4
    Добавление к ответу @Gilles; я использую NFS 3.x файловый сервер (не уверенный в базовой файловой системе; это - или UFS или ZFS, хотя я предполагаю UFS). Под Redhat 6.x: -U виды ко времени создания. В соответствии с Солярисом 10.x: /usr/bin/ls не поддерживает -U, /usr/ucb/ls поддержки -U и действительно сортирует ко времени создания. Эти результаты, очевидно, зависят от файловой системы, хранящей ту информацию во-первых. –  Brian Vandenberg 12.06.2012, 22:44
  • 5
    @ghoti, Если никакие файлы никогда не удалялись (или moved/renamed/hardlinked / …) в каталоге, то порядок каталога является порядком создания на некоторые файловые системы, но не все. Это не верно на ext4, например. Я не знаю, верно ли это на UFS Соляриса. –  Gilles 'SO- stop being evil' 12.02.2016, 14:34

К сожалению, stat(2) API не позволяет получать время создания файла, поскольку он не требуется стандартами Unix.

Однако некоторые файловые системы, как ext4, действительно сохраните эту информацию в файле metadatas. Нет только никакого стандартного способа получить его, но существует путь (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...

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

17
27.01.2020, 19:29
  • 1
    Если кто-либо хочет один лайнер: f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime –  Boop 27.03.2018, 14:37

Вот 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 = $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 };
}
3
27.01.2020, 19:29

[Редактировать]
Используйте эту команду ls -lctдля сортировки файлов поctime(времени последнего изменения информации о состоянии файла ).

7
27.01.2020, 19:29

Сделать это в оболочке. ls не предоставляет время создания, но время изменения. Только debugfs может показать время создания, если раздел ext4

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

    printf "$crtime\t$file\n"
done | sort -k4 | sort -n -k 3 -k 1M -k2 -k4
1
14.02.2020, 10:55

В системах Linux с ядром 4.11 или более поздней версии, с glibc 2.28 или более поздней версии и coreutils 8.31 или более поздней версии , statмогут отображать время рождения файла в файловых системах, в которых он хранится. Вывод, аналогичный ls -l, можно получить с помощью

.
stat -c "%A %4h %U %G %10s %.16w %n" -- *

и отсортированный вывод (при отсутствии имени файла с символами новой строки )с

stat -c "%.10W %A %4h %U %G %10s %.16w %n" -- * |
  sort -k1,1n |
  cut -d' ' -f2-

В coreutils 8.32 или более поздней версии , lsможно отображать и сортировать по времени рождения, используя параметр --time=birth:

ls -l --time=birth

Выше statвызовы используют эти параметры форматирования:

  • %.10W:время рождения в секундах с эпохи Unix (с 10-значной дробной частью ).
  • %A:тип файла и разрешения в формате ls -l
  • %4h:количество жестких ссылок на файл, выровненных по четырем символам
  • %U:имя пользователя-владельца
  • %G:название группы-владельца
  • %10s:размер файла, выровненный по десяти символам
  • %.16w:время рождения в человеческом -удобочитаемом формате, усеченном до шестнадцати символов (достаточного для отображения года, месяца, дня, часа, минуты и секунды)
  • %n:имя файла
9
14.02.2020, 11:40

Теги

Похожие вопросы