Найкращий спосіб перерахувати 100 перших файлів у каталозі, відсортованому за часом


12

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

Якщо труба в голову займає жахливо тривалий час.

Редагувати:

  • Файлова система ext3.
  • обмеження кількості файлів у папці не варто докладати зусиль, оскільки це буде рідкісною операцією «очищення», а файли створюються програмним забезпеченням сторонніх виробників.
  • Використання модифікованого файлу часу замість часу створення забезпечує прийнятне рішення.


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

Відповіді:


14

Ви говорите, що " ls pipeped to 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'.


Якщо вам потрібен час на створення

(короткий час)

Це важче.

Спочатку переконайтеся, що каталог знаходиться у файловій системі, яка відформатована за допомогою 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і видаліть провідний $від просто до відкриття цитати.


Можливо, він може не працювати з ext4. Я запускаю Ubuntu 10.04 на всіх своїх машинах, але запускаю JFS на декількох накопичувачах. AFAIK JFS підтримує позначення часу створення.
jwernerny

Справді. Ми знаємо, що він не підтримується на ext3 і підтримується на ext4. Швидкий пошук дозволяє припустити, що це може працювати з zfs або ufs FreeBSD, але жодне з них не є загальним для Ubuntu! Не знаєте про jfs чи xfs чи що-небудь ще. Будемо раді почути більше, якщо ви зможете знайти інформацію / посилання.
Мікель

Дякую за цю дуже вичерпну відповідь та за тонке нагадування про те, щоб написати більш конкретні запитання;) "Знайти" виявилося переможцем у виставці, а тип fs виявився 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Версія набагато швидше , в моїй системі в будь-якому випадку.
Мікель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.