Лучший способ перечислить 100 первых файлов в каталоге, отсортированном по времени

12

Что было бы лучшим способом перечислить 100 первых файлов в каталоге, отсортированном по созданной метке времени (самый старый первый). Каталог довольно большой (около 100000 файлов).

Ls конвейер голова занимает очень много времени , чтобы закончить.

Редактировать:

  • Файловая система ext3.
  • Ограничение количества файлов в папке не стоит усилий, так как это будет редкая операция «очистки», и файлы создаются сторонним программным обеспечением.
  • Использование времени изменения файла вместо времени создания обеспечивает и приемлемое решение.


источник
1
Если это операция очистки, возможно, вам нужно просто find -mtime +<number of days> -deleteочистить все файлы старше определенного возраста. Это будет означать, что сортировка не нужна.
Микель

Ответы:

14

Вы говорите , что « Ls конвейер голова занимает очень много времени , чтобы закончить».

Причиной этого не является ls, а количество файлов в вашем каталоге. Если у вас есть 100 000 файлов в одном каталоге, любой способ решения этой проблемы должен был бы получить информацию обо всех 100 000 файлов, прежде чем он мог даже подумать о сортировке их или печати какого-либо вывода.

Если это занимает слишком много времени, реальное решение - разделить файлы на несколько каталогов.

Если вы не можете распределить файлы по нескольким каталогам, можете ли вы как-то сузить число файлов для рассмотрения ? например, если в именах файлов указана дата, возможно, вы можете включить подстановочный знак, чтобы система не сортировала 100 000 файлов. Или, может быть, они последовательно пронумерованы? (Это может или не может помочь, но стоит попробовать.)

Сколько раз вы пытаетесь это сделать? Может быть, стоит сохранить / кэшировать вывод для повторного использования .


Теперь вопрос.

Вы уверены, что имеете в виду «время создания», а не «время изменения» ? Большинство инструментов могут отображать только «время изменения», а не «время создания».

Получение «времени создания» - это очень новая вещь, для которой требуется файловая система ext4 и некоторые инструменты, которые нелегко установить.


Если вы хотите изменить время

Время изменения (для краткости ctime) означает время, когда атрибуты файла последний раз изменялись.

ls -c сортирует по времени.

Вы хотите, чтобы вывод был в порядке возрастания, а не в порядке убывания, поэтому вам нужно также изменить вывод с помощью -rопции.

Так что вы можете сделать это так:

ls -cr | head -n 100

Более длинное решение той же проблемы с использованием stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

но это работает медленнее, чем ls -crв моей системе.


Если вы хотите время модификации

Время изменения (для краткости mtime) означает время последнего изменения содержимого файла.

ls -t сортирует по mtime.

Изменить ls -crна ls -tr(лучший вариант) или изменить stat -c $'%Z\t%n'на stat -c $'%Y\t%n'.


Если вам нужно время создания

(кратко для краткости)

Это сложнее.

Сначала убедитесь, что каталог находится в файловой системе, отформатированной с использованием ext4. Вы можете использовать, tune2fs -l <device name>чтобы проверить это.

Затем появился новый statформат %W, который может вам помочь. Чтобы получить его, вам необходимо скачать версию GNU Coreutils, выпущенную в октябре 2010 года или позже, распаковать ее, скомпилировать и установить.

Затем, в зависимости от вашего ядра, это может сработать (еще не пробовал).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Смотрите также:


Если вы получаете ошибки о "'$\t'

Запись '$\t'требует bashили zsh: она не будет работать в dashили shна Ubuntu. Если вам действительно нужно использовать эти оболочки, то вам нужно изменить какие - либо \tдо Ctrl+ V, Tabи удалите ведущий $от просто до открытия цитаты.

Mikel
источник
Возможно, он не работает под ext4. Я запускаю Ubuntu 10.04 на всех своих машинах, но запускаю JFS на нескольких дисках. AFAIK JFS поддерживает создание меток времени.
jwernerny
В самом деле. Мы знаем, что он не поддерживается в ext3 и поддерживается в ext4. Быстрый поиск показывает, что он может работать с zfs или ubss FreeBSD, но ни один из них не распространен в Ubuntu! Не уверен насчет jfs, xfs или чего-то еще. Был бы рад услышать больше, если вы можете найти информацию / ссылки.
Микель
Спасибо за этот очень исчерпывающий ответ и за тонкое напоминание о том, чтобы написать более конкретные вопросы;) «Find» оказался победителем в плане производительности, fs-type оказался ext3.
2

Другой способ, если вы обнаружите, что делаете что-то сегодня, может иметь отношение к вашим проблемам с производительностью:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

Теоретически это должно начать выводить намного быстрее, но я думаю, это зависит от того, откуда исходит задержка. lsДля сортировки файлов может потребоваться много времени.

Оли
источник
Я в этом сомневаюсь. headна самом деле выходит, как только он прочитал достаточно ввода. Попробуйте запустить оба с timeпередней. В headлюбом случае версия намного быстрее в моей системе.
Микель