Список файлів, розмір яких перевищує {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.