Если вы хотите отсортировать в обратном порядке, просто добавьте -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. Обратите внимание, что размер и использование диска не одно и то же.
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?
Вы можете использовать что-то вроде поиска и сортировки.
find . -type f -ls | sort -r -n -k7
(эта -lsопция не является стандартной, но встречается во многих реализациях find, не только в GNU. В GNU find и других, она отображает нечто похожее ls -liс некоторыми исключениями, например, файлы с ACL не помечены знаком +)
Если имена файлов могут содержать символы новой строки, с помощью GNU find и GNU sort:
Предполагается, что столбец «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:
Спасибо за объяснение, Стефан .. Однако по какой-то причине .. команда не работает на моей рабочей станции .. Я использую 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, показывает подробную информацию о пользователе, группе, других атрибутах, дате и т. д.
Не могли бы вы объяснить варианты улучшения качества ответа?
Руи Ф Рибейро
6
Утверждение, что «файлы могут присутствовать где-либо в определенной папке», подразумевает, что вы хотите рекурсивно спускать все каталоги (папки) в пределах начального каталога (папки). Вот что findнужно сделать:
find . -type f -exec ls -lSd {} +
Это «находит» все файлы в текущем рабочем каталоге ( .). Для каждого найденного файла lsзапускается процесс сортировки найденных объектов по размеру. +Терминатор на -execпричинах многочисленных аргументов, передаваемых в списке ls. Если в вашем каталоге (папке) нет очень большого количества файлов, у вас должен быть один список (и, следовательно, один процесс разветвленный), что приведет к желаемому результату.
Я написал кое-что в этой степени некоторое время назад. Вы можете передать аргумент, чтобы указать, сколько файлов перечислить, или просто набрать big, в случае чего вы получите 10.
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
В качестве варианта исходного вопроса, если вы хотите увидеть совокупный размер файлов в подкаталогах:
#!/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).
man ls
:-S sort by file size
Ответы:
Просто используйте что-то вроде:
Capital S .
Это позволит отсортировать файлы по размеру.
Также см:
man ls
Если вы хотите отсортировать в обратном порядке, просто добавьте
-r
переключатель.Обновить:
Чтобы исключить каталоги (и при условии, что ни одно из имен файлов или целей символических ссылок не содержит символов новой строки):
Обновление 2:
Теперь я вижу, как он все еще показывает символические ссылки, которые могут быть папками. Символические ссылки всегда начинаются с буквы l, как в ссылке.
Измените команду для фильтрации
-
. Это должно оставить только обычные файлы:На моей системе это показывает только обычные файлы.
обновление 3:
Чтобы добавить рекурсию, я бы оставил сортировку строк в
sort
команде и велел ей использовать 5-й столбец для сортировки.-rn
означает Обратный и числовой, чтобы получить самые большие файлы в верхней части. Недостатком этой команды является то, что она не показывает полный путь к файлам.Если вам нужен полный путь к файлам, используйте что-то вроде этого:
Команда
find
рекурсивно найдет все файлы во всех подкаталогах.
и вызоветdu -h
(имеется в виду использование диска -humanreadable ), а затем снова отсортирует вывод. Если вашfind
/sort
не поддерживает-h
, замените наdu -k
иsort -rn
. Обратите внимание, что размер и использование диска не одно и то же.источник
du
дает использование диска, которое отличается от размера файла. При использовании (GNU)du -h
числовая сортировка не будет работать (вам потребуется-h
опция GNU для сортировки). xargs ожидает список возможных слов в кавычках в качестве входных данных, поэтому он не будет работать, если имена файлов содержат пробелы или символы в кавычках.find . -type f -print0 | xargs -0 du -h | sort -rh
. Если вы просто хотите сказать , крупнейшие 30 файлов:find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30
.+ |
синтаксис в+ | sort -r -h
?Вы можете использовать что-то вроде поиска и сортировки.
(эта
-ls
опция не является стандартной, но встречается во многих реализациях find, не только в GNU. В GNU find и других, она отображает нечто похожееls -li
с некоторыми исключениями, например, файлы с ACL не помечены знаком +)Если имена файлов могут содержать символы новой строки, с помощью GNU find и GNU sort:
источник
С zsh и GNU ls:
Где
(.OL)
это Глобо классификатор ,.
чтобы выбрать обычные файлы только,OL
чтобы в обратный порядок по длине (размер файла,o
для возрастающего порядка,O
по убыванию).(обратите внимание, что в старых версиях zsh были проблемы с размерами файлов более 2 ^ 32).
Некоторые операционные системы имеют ограничение на размер списка аргументов, передаваемого команде. В этих случаях вам понадобится:
Если вам нужен только список файлов, а не подробный вывод, просто выполните:
Если вы хотите включить скрытые файлы (имя которых начинается с точки, кроме
.
и..
), а такжеD
выполнить поиск в скрытых каталогах, добавьте классификатор globbing:источник
.OL
? Это часть команды?ls (GNU coreutils) 8.25
иzsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Это работает только для определенных версийls
иzsh
?Список файлов по возрастанию размера будет:
Варианты:
источник
Утверждение, что «файлы могут присутствовать где-либо в определенной папке», подразумевает, что вы хотите рекурсивно спускать все каталоги (папки) в пределах начального каталога (папки). Вот что
find
нужно сделать:Это «находит» все файлы в текущем рабочем каталоге (
.
). Для каждого найденного файлаls
запускается процесс сортировки найденных объектов по размеру.+
Терминатор на-exec
причинах многочисленных аргументов, передаваемых в спискеls
. Если в вашем каталоге (папке) нет очень большого количества файлов, у вас должен быть один список (и, следовательно, один процесс разветвленный), что приведет к желаемому результату.источник
Список файлов отображается в обратном порядке:
ls -lSrh
Для возрастания:
ls -lSh
источник
Я написал кое-что в этой степени некоторое время назад. Вы можете передать аргумент, чтобы указать, сколько файлов перечислить, или просто набрать
big
, в случае чего вы получите 10.источник
Попробуйте это, это прекрасно работает для меня.
$ 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 }'
Не идеальный ответ, но работает в некоторой степени
источник
sed
чтобы сократить выводДобавление к ответу Дельха и комментарию Стефана Шазеля ...
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 .
источник
В качестве варианта исходного вопроса, если вы хотите увидеть совокупный размер файлов в подкаталогах:
Размеры будут отображаться в мегабайтах (
m
вdu -sm
). Другие значения , принятыеdu
в-k
килобайты,-g
гигабайты. Использование-h
для удобочитаемого дисплея невозможно, потому что это нарушит сортировку.Вот версия, которая используется
sed
для добавленияM
для мегабайта:Каталог для отображения задается с помощью
${1:-.}
которого будет использоваться первый аргумент командной строки, если он указан, или текущий каталог, если он вызывается без аргументов.ПРИМЕЧАНИЕ. Это может занять много времени при большом количестве файлов. Опция
-type d
будет перечислять только подкаталоги и исключать файлы в текущей папке; если вы также хотите увидеть файлы в текущей папке, удалите их.источник