Список файлів, розмір яких перевищує {size}, відсортований за датою


27

Я хочу вирішити проблему "перерахуйте 10 найновіших файлів у поточному каталозі понад 20 МБ".

З цим lsя можу:

ls -Shal |head

щоб отримати топ-10 найбільших файлів, і:

ls -halt |head

щоб отримати топ-10 останніх файлів

З пошуку я можу:

find . -size +20M

Щоб перерахувати всі файли понад 20 Мб у поточному каталозі (та підкаталогах, які я не хочу).

Чи є спосіб перерахувати десятку найновіших файлів певного розміру, бажано, використовуючи ls?

Відповіді:


24

Параметр "поточний каталог" для findє -maxdepth 1. Весь командний рядок для ваших потреб:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

або

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

Примітка. Це буде працювати для GNU-пошуку, але не для будь-якої іншої знахідки.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Починаючи як @Rajish, але використовуючи printfкоманду з, findщоб вказати вихідний формат. Існують 3 формати, пов'язані з часом, atime, ctime і mtime - %Tце для mtime, %Aа %Cтакож для інших форматів.

@полягає в тому, щоб вказати формат часу в секундах з епохи. %fє для імені файлу, \nдля нового рядка між двома файлами.

Потім сортування за номером у зворотному порядку спочатку дає наймолодші файли, і ми беремо 20 рядків¹ з head.

Зрештою, sedвикористовується, щоб викинути інформацію про час.

¹) оскільки headпрацює рядок за рядком, один файл із назвою понад 20 нових рядків, що є дещо незвичним, але не забороненим, може пошкодити вихід, якщо йому належать перші 20 збігів. Якщо у вас є такі файли, будь ласка, спробуйте позбутися від них - ну, щоб змінити їх назву. Вони часто будуть проблемою для простих сценаріїв.


1
Якщо ви використовуєте file«s -lsкоманди, спеціальні символи будуть надруковані в вигляді зворотної косої маскування символів: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Крім того, як буде виглядати формат ls -l, EoghanM також -lвсе одно вказав .
— манатура

printfпрацює лише для конкретних дистрибутивів GNU.
— Brethlosze

%T+генерує людські часові позначки, такі, 2018-11-06+13:37:54.4606466460які також можна сортувати за sort(без -n), див .: unix.stackexchange.com/questions/29899/…
— Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Глобальні кваліфікатори Zsh полегшують це. В .класифікатор вибирає тільки звичайні файли, Lm+20вибирає файли, які по крайней мере 20MB плюс один байт; щоб включити файли довжиною рівно 20 Мб L+20971519. Потім omсортує за зменшенням часу модифікації та [1,10]обмежує розширення на перші 10 збігів. Вам все ще потрібна -tопція, lsякщо ви хочете перерахувати файли за датою; або ви можете передати файли до якоїсь іншої команди (наймолодшої спочатку). Щоб передати файли в іншу команду з найстарішим файлом спочатку, використовуйте Omсортування за допомогою збільшення часу модифікації та [-10,-1]вилучення останніх 10 збігів.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

Я думаю, що це може бути кращим способом вирішити проблему ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Щоб позбутися будь-яких помилок під час пошуку спроб отримати доступ до файлів, які ви не маєте права читати, які ви хочете додати

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

Це надрукує лише вказані 10 файлів, незалежно від будь-яких вбудованих символів нового рядка в імена файлів. Тут використовується файлова системаinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

Дякую за всі відповіді. Що я пішов, це наступне:

ls -halt | grep "M " |head

Хоча він прощає 20 мегабайт на користь чого-небудь за мегабайт (і під гігабайт), його легко запам’ятати і зберегти людський читабельний елемент розмірів файлів.


4
Ви не повинні намагатися проаналізувати вихід ls, він показує представлення файлів, нічого більше. Для простих імен файлів вихідний сигнал, як правило, еквівалентний імені файлу, але не слід покладатися на нього.
— Кріс Даун

Це правда, я впевнений, але з точки зору людського користувача (а вихід не прокладається в іншому місці), це легше запам’ятати, оскільки його можна легше зібрати з відомих простих інструментів tldp.org/LDP/GNU-Linux- Tools-Summary / html / c1089.htm
— EoghanM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.