Я ищу список всего содержимого каталога, включая содержимое вложенных папок, но отсортировано по размеру файла. До сих пор мне удавалось дойти до распечатки и сортировки, хотя и с рекурсивностью ls -lhSR
( h
это приятно иметь, но определенно не важно для меня, пока я могу получить размеры файлов). Я, вероятно, упускаю из виду что-то очевидное или спрашиваю о невозможном, но любой совет здесь будет принят с благодарностью.
9
Поскольку вы не указали конкретную оболочку, вот альтернативный вариант с использованием квалификаторов глобуса zsh с
для рекурсии. Тогда, например:
рекурсивный список простых файлов:
рекурсивно перечислим обычные файлы, о rdered путем в биговки L ength (т.е. размер):
рекурсивно список обычных файлов, O rdered по де размера гибочного:
Рекурсивно перечислите простые файлы, упорядоченные по уменьшению размера, и выберите первые 3 результата:
Если вы хотите, чтобы размеры файлов также, то вы можете использовать
источник
С установленным
globstar
параметром оболочки вы можете использовать оболочку:Если вы попытаетесь сделать это с большим количеством файлов, вы получите ошибку «Список аргументов слишком длинный». Чтобы обойти это, вы можете использовать
printf
иxargs
:Я только что понял, что это печатает также и каталоги (размером 4096 байт) - если вы этого не хотите, используйте вместо этого:
Пример запуска
источник
dotglob
оболочки, смотрите мой обновленный ответ.printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
ls -lhSd **/*
если вы не против иметь каталоги как часть списка. Или, если ни одно из имен ваших каталогов не содержится.
в них, и все файлы, которые вы хотите сделать , вы можетеll -hS **/*.*
, или аналогичные.Если у вас нет zsh, вы все равно можете использовать
du
+sort
:Удобочитаемые размеры, включая совокупные размеры каталогов:
Только файлы (используя
find
):В обеих случаях, я решил использовать завершающий нуль линии (
-0
,-z
,-print0
опционы), чтобы быть безопасными против всех действительных имен файлов.источник
Для быстрого интерактивного использования на деревьях каталогов, которые не слишком велики,
shopt -s globstar
это действительно приятно. Глоб не может отфильтровывать каталоги по типу, но если вы используете его,ls -d
тоls
просто напечатает имя каталога, а не его содержимое.Предполагая ваш
ll
псевдоним включает в себя-lh
:даст вам вывод, как это (из моего каталога code-golf), но с цветной подсветкой (так что каталоги легче увидеть). Обратите внимание, что сортировка по размеру файла происходила по подкаталогам.
Вы можете отфильтровать каталоги, пропуская через
grep -v '^d'
Иногда вы можете использовать глоб, который соответствует только файлам, а не каталогам, если ваши имена файлов имеют шаблон. Например
ll -rSd **/*.jpg
, или даже**/*.*
работает, если ни одно из ваших имен каталогов нет.
в них, и все файлы, которые вы хотите сделать .(Для людей с опытом работы в DOS: в этом нет ничего волшебного
*.*
Unix . Он просто соответствует любой записи каталога, содержащей буквальную точку. Но кроме исполняемых файлов и иногда текстовых файлов, обычно дают расширения для имен файлов.)@dessert указывает, что вам нужно,
shopt -s dotglob
чтобы он соответствовал всем файлам.С GNU
find
Если в одной
ls
командной строке не слишком много файлов ,find -exec ls {} +
поместите их в командную строку, где ихls
можно отсортировать.Использование
-not -type d
вместо-type f
избегать игнорирования символических ссылок, именованных каналов, сокетов, файлов устройств и всего, что у вас есть в ваших каталогах.С
du
:Теперь имена каталогов сортируются в списке, чтобы суммировать все их содержимое, но отдельные файлы по-прежнему включены.
sort -h
, ака--human-numeric-sort
, сортирует числа с суффиксами размера какdu -h
печатные издания. Это идеально подходит для использования сdu
.Я часто использую
du -sch * | sort -h
, или*/
чтобы получить только каталоги.du -sch **/* | sort -h
даст вам вышеупомянутый вывод, если вы забудете, чтоdu
есть-a
опция.(Я только нашел время, чтобы найти его, потому что отправляю ответ. Для интерактивного использования я бы, наверное, просто использовал
du -sch **/*
.источник