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

241

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

Джо
источник
связанные unix.stackexchange.com/questions/88065/…
Мэтт Вилки
5
от man ls:-S sort by file size
ctrl-alt-delor
Вы имеете в виду «файлы находятся в этом каталоге» или «файлы могут находиться в любом подкаталоге».
ctrl-alt-delor
Если вы можете / хотите использовать инструмент с графическим интерфейсом, взгляните на QDirStat , ранее KDirStat .
RhinoDevel

Ответы:

290

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

ls -lS /path/to/folder/

Capital S .

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

Также см:

man ls

-S     sort by file size

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

Обновить:

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

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(имеется в виду использование диска -humanreadable ), а затем снова отсортирует вывод. Если ваш find/ sortне поддерживает -h, замените на du -kи sort -rn. Обратите внимание, что размер и использование диска не одно и то же.

Delh
источник
5
duдает использование диска, которое отличается от размера файла. При использовании (GNU) du -hчисловая сортировка не будет работать (вам потребуется -hопция GNU для сортировки). xargs ожидает список возможных слов в кавычках в качестве входных данных, поэтому он не будет работать, если имена файлов содержат пробелы или символы в кавычках.
Стефан Шазелас
1
Я вижу, что -S делает упорядочение по убыванию, а как по возрастанию?
demongolem
3
После @ StéphaneChazelas, это работает для меня: find . -type f -print0 | xargs -0 du -h | sort -rh. Если вы просто хотите сказать , крупнейшие 30 файлов: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543
Здравствуй! Не могли бы вы объяснить + |синтаксис в + | sort -r -h?
Виктор
@Victor, см. Unix.stackexchange.com/questions/195939/… .
Хью Вольф
25

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

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

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

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

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
Марк Коэн
источник
Предполагается, что столбец «group» (из -ls) не содержит пробелов (следовательно, параметр -k 7), но это не обязательно так.
Колистивра
1
почему бы просто не найти ... -print0 | сортировать -zk7rn0?
Андре де Миранда
10

С zsh и GNU ls:

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

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

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

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

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

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

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

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

print -rl -- **/*(.DOL)
Стефан Шазелас
источник
что делает .OL? Это часть команды?
alpha_989
@ alpha_989, см. правку
Стефан Шазелас
Спасибо за объяснение, Стефан .. Однако по какой-то причине .. команда не работает на моей рабочей станции .. Я использую ls (GNU coreutils) 8.25и zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Это работает только для определенных версий lsи zsh?
alpha_989
@ alpha_989, каким образом он у тебя не работает? Он работает для меня с теми же версиями, и в этом коде нет ничего, что не работало бы в версиях, по крайней мере, 15 лет назад.
Стефан Шазелас
9

Список файлов по возрастанию размера будет:

ls -lSr

Варианты:

  • l: long, показывает подробную информацию о пользователе, группе, других атрибутах, дате и т. д.
  • S: список заказов по размеру (по убыванию)
  • r: обратный порядок листинга
пекарь
источник
Не могли бы вы объяснить варианты улучшения качества ответа?
Руи Ф Рибейро
6

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

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

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

JRFerguson
источник
1
это хорошо, так как позволяет вам использовать модификатор -h в ls, чтобы показать хорошие размеры файлов
shmish111
4

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

Для возрастания: ls -lSh

user174839
источник
1
+1 за использование флага -h для удобного вывода.
вычислительная техника
2

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

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
Эмануэль Берг
источник
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 
Sand1512
источник
1
awk работает нормально, если имена файлов не содержат пробелов.
Эйр Ним
да .. использовать 'sed' и заменить пробел подчеркиванием? если это поможет
Sand1512
Нет, я использую, sedчтобы сократить вывод
Eir Nym
1

Добавление к ответу Дельха и комментарию Стефана Шазеля ...

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

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

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

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

#!/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будет перечислять только подкаталоги и исключать файлы в текущей папке; если вы также хотите увидеть файлы в текущей папке, удалите их.

Примечание: вы можете использовать ncduвместо этого то, что доступно в большинстве репозиториев linux (в ubuntu / debian apt install ncdu), а также в osx ( brew install ncdu).

ccpizza
источник