Файлы списка, больше, чем {размер}, отсортированный по дате

Посмотрите этот вопрос.

Когда Вы работаете ps ax | grep string:

[steve@sage-arch ~]$ ps ax | grep 'openbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 5100 pts/0    S+     0:00 grep openbox

последняя строка, содержащая grep немного раздражающие somethings

Можно избавить себя от этого путем выполнения ps ax | grep '[s]tring':

[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session

обновление: или просто выполненный pgrep string

28
13.09.2011, 13:55
6 ответов

Опция 'текущего каталога' для 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
25
27.01.2020, 19:39

Примечание: Это будет работать на находку 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 для других форматов.

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

Затем сортировка по числу в обратном порядке дает самые молодые файлы сначала, и мы проводим 20 строк ¹ с head.

В конце, sed используется, для выбрасывания информации времени.

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

8
27.01.2020, 19:39
  • 1
    Если Вы используете file -ls команда, специальные символы будут распечатаны как оставленные из обратной косой черты символы: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Дополнительно формат будет похож ls -l, EoghanM также указан -l так или иначе. –  manatwork 13.09.2011, 18:39
  • 2
    printf только работы для определенных дистрибутивов GNU. –  Brethlosze 28.11.2017, 22:42

Спецификаторы шарика 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])
5
27.01.2020, 19:39

Это распечатает только указанные 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
27.01.2020, 19:39

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

ls -halt | grep "M " |head

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

-1
27.01.2020, 19:39
  • 1
    Вы не должны пытаться проанализировать вывод ls, это показывает Вам представление файлов, ничто больше. Для простых имен файлов вывод главным образом, оказывается, эквивалентен имени файла, но Вы не должны полагаться на него. –  Chris Down 15.09.2011, 12:38

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

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 
2
27.01.2020, 19:39

Теги

Похожие вопросы