Как перечислить все файлы, упорядоченные по размеру

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

172 голоса | спросил Joe 3 62012vEurope/Moscow11bEurope/MoscowSat, 03 Nov 2012 19:21:09 +0400 2012, 19:21:09

10 ответов


194

Просто используйте что-то вроде:

ls -lS /path/to/folder/

Капитал S .

Это сортирует файлы по размеру.

Также смотрите:

man ls

-S     sort by file size

Если вы хотите отсортировать в обратном порядке, просто добавьте ключ -r.

Update:

Чтобы исключить каталоги (и если ни одно из имен файлов или целей символической ссылки не содержит символов новой строки):

ls -lS | grep -v '^d' 

Обновление 2:

Теперь я вижу, как он все еще показывает символические ссылки, которые могут быть папками. Символические ссылки всегда начинаются с буквы l, как в ссылке.

Измените команду для фильтрации для -. Это должно оставить только обычные файлы:

ls -lS | grep '^-'

В моей системе это показывает только обычные файлы.

обновить 3:

Чтобы добавить рекурсию, я бы оставил сортировку строк в команде sort и сказал ей использовать 5-й столбец для сортировки.

ls -lR | grep '^-' | sort -k 5 -rn

-rn означает обратный и числовой, чтобы получить самые большие файлы вверху. Внизу этой команды указано, что он не показывает полный путь к файлам.

Если вам нужен полный путь к файлам, используйте что-то вроде этого:

find . -type f  -exec du -h {} + | sort -r -h

Команда find будет рекурсивно находить все файлы во всех подкаталогах . и вызывать du -h (что означает использование диска -humanableable ), а затем снова отсортируйте результат. Если ваш find /sort не поддерживает -h, замените на du -k и sort -rn. Обратите внимание, что размер и использование диска - это не одно и то же.

ответил delh 3 62012vEurope/Moscow11bEurope/MoscowSat, 03 Nov 2012 19:27:56 +0400 2012, 19:27:56
18

Вы можете использовать что-то вроде поиска и сортировки.

find . -type f -ls | sort -r -n -k7

(параметр -ls не является стандартным, но встречается во многих реализациях поиска, а не только в GNU. В GNU find и других он отображает нечто похожее на ls -li за несколькими исключениями, например, файлы с ACL не помечены знаком +)

Если имена файлов могут содержать символы новой строки, с GNU find и GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
ответил Mark Cohen 3 62012vEurope/Moscow11bEurope/MoscowSat, 03 Nov 2012 22:33:55 +0400 2012, 22:33:55
8

С zsh и GNU ls:

ls -ldU -- **/*(.OL)

Где (.OL) является glob qualifier , ., чтобы выбрать только обычные файлы, OL, чтобы изменить порядок по длине ( размер файла, o для возрастания, O для нисходящего).

(обратите внимание, что в старых версиях zsh были проблемы с размерами файлов более 2 ^ 32).

Некоторые операционные системы имеют ограничение на размер списка аргументов, переданного команде. В таких случаях вам понадобится:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Если вам нужен только список файлов, а не подробный вывод, просто выполните:

print -rl -- **/*(.OL)

Если вы хотите включить скрытые файлы (имя которых начинается с точки, кроме . и ..)), а также искать в скрытых каталогах, добавьте D:

print -rl -- **/*(.DOL)
ответил Stéphane Chazelas 3 62012vEurope/Moscow11bEurope/MoscowSat, 03 Nov 2012 20:49:59 +0400 2012, 20:49:59
6

Говоря, что «файлы могут присутствовать где угодно в определенной папке», подразумевается, что вы хотите рекурсивно спускать все каталоги (папки) в стартовом каталоге (папке). Это то, что нужно сделать find:

find . -type f -exec ls -lSd {} +

Это «находит» все файлы в текущем рабочем каталоге (.). Для каждого найденного файла выполняется процесс ls для сортировки объектов, найденных в порядке размера. Терминатор + для -exec вызывает несколько аргументов для передачи в виде списка ls. Если ваш каталог (папка) содержит очень большое количество файлов, у вас должен быть один список (и, следовательно, один процесс forked), что приведет к желаемому результату.

ответил JRFerguson 3 62012vEurope/Moscow11bEurope/MoscowSat, 03 Nov 2012 22:30:01 +0400 2012, 22:30:01
2

Я написал что-то в этом роде некоторое время назад. Вы можете передать аргумент, чтобы указать, сколько файлов нужно перечислить, или просто введите big, в каком случае вы получите 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
ответил Emanuel Berg 4 72012vEurope/Moscow11bEurope/MoscowSun, 04 Nov 2012 07:30:11 +0400 2012, 07:30:11
2

Попробуй, это отлично работает для меня.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Не идеальный ответ хотя и работает в некоторой степени

$ ls -lS |grep  '^-' | head -n 6 
ответил san1512 1 J0000006Europe/Moscow 2015, 06:00:59
2

Список файлов по возрастанию по возрастанию:

ls -lSr

Возможные варианты:

  • l: long, показывает подробный пользователь, группу, другие атрибуты, дату и т. д.
  • S: список заказов по размеру (по умолчанию по убыванию)
  • r: отменяет порядок перечисления
ответил Baker 29 J0000006Europe/Moscow 2016, 21:28:17
1

Отображение списка файлов в обратном порядке: ls -lSrh

В порядке возрастания: ls -lSh

ответил user174839 13 J0000006Europe/Moscow 2016, 13:54:14
0

Добавление к ответу Дели и комментарий Штефана Чазеласа ...

find -print0 в сочетании с xargs -0 добавляет поддержку пробелов /пробелов /whatnots.

du -h | sort -rn не сортирует должным образом между различными кратными байтами, например. 1.1M будет отображаться после 128K, что неверно.

sort -rh (--human-numeric-sort) позаботится об этом, но он работает только с версией GNU.

Команды ниже предоставят желаемый результат.

Человеко-читаемый, на соискателе GNU /Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

В единицах килобайта, на BSD /OSX /другие:

find . -type f -print0 | xargs -0 du -k | sort -rn

Для BSD /OSX также см. https://unix.stackexchange.com/a/188375/82895.

ответил djule5 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 04 Sep 2015 23:07:18 +0300 2015, 23:07:18
0

Как вариант исходного вопроса, если вы хотите увидеть кумулятивный размер файлов в подкаталогах:

 #!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Размеры будут отображаться в мегабайтах (m в du -sm). Другие значения, принятые du, являются -k для килобайт, -g для гигабайт. Использование -h для чтения с человека не представляется возможным, так как оно разбивает сортировку.

Вот версия, которая использует sed для добавления M для мегабайта:

 find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Отображаемый каталог устанавливается через ${1:-.}, который будет использовать первый аргумент командной строки, если он предоставлен, или использовать текущий каталог, если он вызван без аргументов.

ПРИМЕЧАНИЕ. Это может занять много времени с большим количеством файлов. Опция -type d будет отображать только подкаталоги и исключать файлы в текущей папке; если вы также хотите увидеть файлы в текущей папке, тогда удалите их.

ответил ccpizza 24 J000000Sunday16 2016, 13:19:11

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132