Список файлов, размер которых превышает {размер}, отсортированный по дате

27

Я хочу решить проблему «перечислить 10 самых последних файлов в текущем каталоге размером более 20 МБ».

С lsя могу сделать:

ls -Shal |head

получить 10 самых больших файлов и:

ls -halt |head

чтобы получить топ 10 самых последних файлов

С помощью find я могу сделать:

find . -size +20M

Чтобы вывести список всех файлов размером более 20 МБ в текущем каталоге (и подкаталогах, которые мне не нужны).

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

EoghanM
источник

Ответы:

24

Параметр «текущий каталог» для findis -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
Rajish
источник
8

Примечание: это будет работать для GNU-find, но не для любой другой находки.

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

Начинается как @Rajish, но используется printfкоманда from findдля указания формата вывода. Существует 3 формата времени: atime, ctime и mtime - %Tдля mtime %Aи %Cдля других форматов.

@указать формат времени в секундах с начала эпохи. %fдля имени файла, \nдля новой строки между 2 файлами.

Затем сортировка по номеру в обратном порядке дает сначала самые младшие файлы, и мы берем 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.
manatwork 13.09.11
printfработает только для определенных дистрибутивов GNU.
Brethlosze
%T+генерирует удобочитаемые временные метки, подобные 2018-11-06+13:37:54.4606466460которым также можно сортировать sort(без -n), см .: unix.stackexchange.com/questions/29899/…
Сиро Сантилли,
5

ЗШ в GLOB отборочные сделать это легко. Спецификатор .выбирает только обычные файлы, Lm+20выбирает файлы размером не менее 20 МБ плюс один байт; чтобы включить файлы размером ровно 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 пытается получить доступ к файлам, у которых у вас нет прав на чтение, вы можете захотеть добавить

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
Peter.O
источник
-1

Спасибо за ответы на все вопросы. То, что я пошел на это следующее:

ls -halt | grep "M " |head

Хотя он отказывается от 20 мегабайт в пользу чего-либо более мегабайта (и меньше гигабайта), он легко запоминается и сохраняет читаемый человеком элемент размеров файлов.

EoghanM
источник
4
Вы не должны пытаться анализировать вывод ls, он показывает представление файлов, ничего более. Для простых имен файлов вывод в большинстве случаев эквивалентен имени файла, но вы не должны полагаться на него.
Крис Даун
Это правда, я уверен, но с точки зрения пользователя (и вывода, не передаваемого в другом месте), этот легче запомнить, так как его проще собрать из известных простых инструментов tldp.org/LDP/GNU-Linux- Tools-Summary / html / c1089.htm
EoghanM