Список файлов размером более {размер} сортируется по дате

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

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

 ls -Shal |head 

для получения 10 крупнейших файлов и:

 ls -halt |head 

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

С находкой я могу сделать:

 find . -size +20M 

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

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

Параметр «текущий каталог» для 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 
 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 матчам. Если у вас такие файлы, попробуйте избавиться от них – ну, чтобы изменить их имя. Они часто будут проблемой для простых скриптов.

Профили Glob Zsh делают это легко. . квалификатор выбирает только обычные файлы, 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]) 

Я думаю, что это может быть лучший способ решить проблему …

 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 

Это будет печатать только указанные 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 

Спасибо за ответы на все вопросы. Для меня это следующее:

 ls -halt | grep "M " |head 

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