Я хотел бы перечислить все файлы в порядке от большого до маленького размера, и файлы могут присутствовать в любом месте определенной папки.
man ls
:-S sort by file size
Я хотел бы перечислить все файлы в порядке от большого до маленького размера, и файлы могут присутствовать в любом месте определенной папки.
man ls
:-S sort by file size
Ответы:
Просто используйте что-то вроде:
ls -lS /path/to/folder/
Capital S .
Это позволит отсортировать файлы по размеру.
Также см:
-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
. Обратите внимание, что размер и использование диска не одно и то же.
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
?
Вы можете использовать что-то вроде поиска и сортировки.
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'
С 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
? Это часть команды?
ls (GNU coreutils) 8.25
и zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Это работает только для определенных версий ls
и zsh
?
Список файлов по возрастанию размера будет:
ls -lSr
Варианты:
Утверждение, что «файлы могут присутствовать где-либо в определенной папке», подразумевает, что вы хотите рекурсивно спускать все каталоги (папки) в пределах начального каталога (папки). Вот что find
нужно сделать:
find . -type f -exec ls -lSd {} +
Это «находит» все файлы в текущем рабочем каталоге ( .
). Для каждого найденного файла ls
запускается процесс сортировки найденных объектов по размеру. +
Терминатор на -exec
причинах многочисленных аргументов, передаваемых в списке ls
. Если в вашем каталоге (папке) нет очень большого количества файлов, у вас должен быть один список (и, следовательно, один процесс разветвленный), что приведет к желаемому результату.
Список файлов отображается в обратном порядке: ls -lSrh
Для возрастания: ls -lSh
Я написал кое-что в этой степени некоторое время назад. Вы можете передать аргумент, чтобы указать, сколько файлов перечислить, или просто набрать big
, в случае чего вы получите 10.
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
Попробуйте это, это прекрасно работает для меня.
$ 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
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 .
В качестве варианта исходного вопроса, если вы хотите увидеть совокупный размер файлов в подкаталогах:
#!/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 / debianapt install ncdu
), а также в osx (brew install ncdu
).