Как лучше всего перечислить 100 первых файлов в каталоге, отсортированном по созданной метке времени (самый старый первый). Каталог довольно большой (около 100000 файлов).
ls по трубопроводу голова занимает ужасно много времени.
Редактировать:
. Вы говорите, что " 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 и удалите начальную $
непосредственно перед открывающей цитатой.
Другой способ, если он найден сегодня, может иметь отношение к вашим проблемам с производительностью:
I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done
Теоретически это должно начать выводить намного быстрее, но я думаю, это зависит от откуда происходит отставание. ls
может занять много времени, чтобы отсортировать файлы.