Найти файлы старше X дней и вывести их по размеру

8

Я пытаюсь получить файлы старше нескольких дней и перечислить их в порядке убывания на основе их размера со всей их информацией (размер, полный путь и т. Д. - что-то похожее, что обеспечивается ls).

Хотя я могу найти файлы старше с:

find . -mtime +10

Я не могу перечислить желаемую информацию.

user148335
источник
пожалуйста, добавьте ваш дистрибутив и информацию о оболочке
lese
@lese: AIX 6.1; пока echo $ SHELL -> / usr / bin / ksh
user148335
Это звучит как проблема XY ... вам действительно, как вы спрашиваете, нужны ВСЕ файлы по размеру? или вы (более вероятно) ищете «старые» (> 10 дней) файлы, достаточно большие, и вам просто нужно, скажем, 200 самых больших, чтобы затем решить, какой из них вы можете удалить, чтобы сэкономить место ?. В последнем случае, и поскольку вы работаете в AIX без инструментов gnu, комбинация find (вывод всех файлов> 10 дней) и awk (сохранение 200 самых больших файлов в массиве с последующим выводом по порядку) будет вашей Лучшая ставка
Оливье Дюлак

Ответы:

8

При условии, что ваши пути к файлам не содержат символов новой строки:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Смотрите findруководство , раздел Actions.

КСТАТИ: Обратите внимание, что руководство POSIX find не определяет большинство из вышеуказанных действий.

patryk.beza
источник
1
Там написано: find: 0652-017 -printf не является допустимым параметром.
user148335
для меня это работает и кажется довольно чистым решением +1
lese
@ user148335, вы не упомянули, какой дистрибутив Linux вы используете. Кажется, вы ограничены спецификацией поиска POSIX , которая довольно ограничена.
patryk.beza
1
@ patryk.beza Я думаю, что вы разговаривали с user148335
lese
AIX 6.1; пока echo $ SHELL -> / usr / bin / ksh
user148335
4

Эта команда использует только POSIX особенности findи из ls:

find . -type f -mtime +10 -exec ls -lS {} +

Однако он может вызываться lsнесколько раз, если в текущем каталоге (или подкаталогах) очень большое количество файлов, соответствующих -mtime +10первичному.

lsКонечно, если вызов вызывается более одного раза, сортировка будет выполняться только при каждом lsвыполнении, а не по нескольким.

Тем не менее, для разумного количества файлов, это, вероятно, ваш лучший выбор.

Мигель Г
источник
Обновленная версия не разрывается с пробелами в имени
Miguel G
1
Если lsпередается только один аргумент, он может выполнить небольшую сортировку. С +вместо ;, это было бы лучше, но lsвсе еще может в конечном итоге вызывается несколько раз , если есть много файлов.
Стефан Шазелас
2
Это точная команда, которую я дал бы, поэтому я добавил пояснительный текст, который я бы дал, чтобы выполнить его.
Wildcard
3

С zsh:

ls -ldrS -- **/*(m+10)

Или чтобы избежать двойной сортировки (по имени по zsh и по размеру по ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

или (если ваша lsподдержка не -Uотсортирована):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Добавьте Dспецификатор glob, если вы хотите видеть скрытые файлы.

Стефан Шазелас
источник
Работает ли это, когда имена пользователей и групп содержат пробелы?
Ройма
@roaima, да. Почему бы и нет? Это может сломаться для E2BIG, который вы можете обойти, используя zargs.
Стефан Шазелас
Так как вы предоставили это, я подозревал, что это будет хорошо, но мне нужно было спросить :-)
roaima
1

Я думаю, что вы могли бы сделать что-то похожее на:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

обратите внимание на -Sпараметр lsкоманды:

-Сортировать по размеру файла

оскорбление
источник
После удаления -d $ '\ 0' из-за сообщения: $ \ 0: это не идентификатор, который мне удалось получить, но файлы не записываются по убыванию в зависимости от их размера
user148335
Сломается, когда вы встречаете каталог под /home/phphil. Попробуйтеls -ld ...
Роайма
@Roaima, а как насчет использования find . -type fвместо?
lese
@lese Я изменил код, но команда, кажется, выбрасывает дважды каждый файл из каждой подпапки. Ex.
user148335
find ... -type fбудет работать, как если бы добавив -dфлаг кls
roaima
1

попробуй это:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g
dervishe
источник
С опцией -n это не проблема, потому что ls не перечисляет имя пользователя и имя группы, а вместо этого uid и gid
dervishe
0

Для облегчения использования одной строки вы можете использовать эту findопцию -ls. Похоже, что в большинстве случаев размер файла находится в седьмом столбце перечисленной информации (поэтому, если нет, измените его 7в конце команды):

find . -type f -mtime +10 -ls | sort -n -r -k7
woodengod
источник
0

Другой вариант будет использовать:

  • найти (найти подходящие файлы)
  • du (чтобы показать размер файла в КБ)
  • sort -n -r (для сокращения в порядке убывания)

Вот команда:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
Стивен Куан
источник