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

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

ls по трубопроводу голова занимает ужасно много времени.

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

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

13
задан 28 January 2011 в 18:38

2 ответа

. Вы говорите, что " ls , переданный в head , занимает ужасное долгое время для завершения ».

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

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

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

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


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

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

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


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

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

ls -c сортирует по ctime.

Вы хотите выводить данные в порядке возрастания, не по убыванию, поэтому вам также необходимо изменить вывод с помощью параметра -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' .


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

(сокращенно crtime)

Это сложнее.

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

Затем есть новый формат 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 : она не будет работать в тире или sh в Ubuntu. Если вам действительно нужно использовать эти оболочки, вам нужно будет изменить любой \ t на Ctrl + V , Tab и удалите начальную $ непосредственно перед открывающей цитатой.

14
ответ дан 28 January 2011 в 18:38

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

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

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

2
ответ дан 28 January 2011 в 18:38

Другие вопросы по тегам:

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