Перечисление файлов в каталоге, включая содержимое подпапок с сортировкой
Я ищу список всего содержимого каталога, включая содержимое вложенных папок, но отсортировано по размеру файла. До сих пор мне удавалось добираться до перечисления и сортировки, в то же время оставаясь рекурсивным с ls -lhSR
(h
приятно иметь, но определенно не важно для меня, пока я могу получить размеры файлов). Я, вероятно, упускаю из виду что-то очевидное или спрашиваю о невозможном, но любой совет здесь будет принят с благодарностью.
5 ответов
Вы можете использовать найти:
find . -type f -printf "%s %P\n" | sort -n
Необязательно: Чтобы преобразовать байтовые значения в понятный человеку формат, добавьте следующее:
| numfmt --to=iec-i --field=1
Объяснение:
find in current directory (.) all files (-type f)
-printf: suppress normal output and print the following:
%s - size in bytes
%P - path to file
\n - new line
| sort -n: sort the result (-n = numeric)
Поскольку вы не указали конкретную оболочку, вот альтернативный вариант с использованием квалификаторов глобуса zsh с
setopt extendedglob
для рекурсии. Тогда, например:
рекурсивный список простых файлов:
printf '%s\n' **/*(.)
рекурсивно вывести список простых файлов, упорядоченных по возрастанию L (т.е. по размеру):
printf '%s\n' **/*(.oL)
рекурсивный список простых файлов, упорядоченных по уменьшенному размеру:
printf '%s\n' **/*(.OL)
Рекурсивно перечислите простые файлы, упорядоченные по уменьшению размера, и выберите первые 3 результата:
printf '%s\n' **/*(.OL[1,3])
Если вы хотите, чтобы размеры файлов также, то вы можете использовать
du -hb **/*(.OL[1,3])
С globstar
набор параметров оболочки вы можете использовать оболочку globbing:
shopt -s globstar # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n
Если вы попытаетесь сделать это с большим количеством файлов, вы получите ошибку "Список аргументов слишком длинный". Чтобы обойти это, вы можете использовать printf
а также xargs
:
printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n
Я только что понял, что это печатает также и каталоги (размером 4096 байт) - если вы этого не хотите, используйте вместо этого:
stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n
Пример запуска
$ tree
.
├── edits.png
├── makescript
├── new
│ └── edits.png
└── test
└── 1.png
2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
Если у вас нет zsh, вы все равно можете использовать du
+ sort
:
Удобочитаемые размеры, включая совокупные размеры каталогов:
du --apparent-size -ah0 . | sort -zh | xargs -0L1
Только файлы (используя
find
):find . -type f -print0 | du --files0-from=- --apparent-size -ah0 | sort -zh | xargs -0L1
В обоих случаях я решил использовать строки с нулевым символом в конце (-0
, -z
, -print0
параметры), чтобы быть в безопасности от всех допустимых имен файлов.
Для быстрого интерактивного использования на деревьях каталогов, которые не слишком велики, shopt -s globstar
действительно приятно. Глоб не может отфильтровать каталоги по типу, но если вы используете его с ls -d
затем ls
просто напечатает имя каталога, а не содержимое.
Предполагая ваш ll
псевдоним включает -lh
:
# with shopt -s globstar in your .bashrc
ll -rSd **/*
даст вам вывод, как это (из моей директории code-golf), но с цветной подсветкой (чтобы было легче видеть каталоги). Обратите внимание, что сортировка по размеру файла происходит по подкаталогам.
drwxr-xr-x 1 peter peter 70 Jun 8 07:56 casexchg
...
drwxr-xr-x 1 peter peter 342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter 387 Jul 29 2017 likely.cpp
-rw-r--r-- 1 peter peter 416 Aug 31 2017 true-binary.asm~
-rw-r--r-- 1 peter peter 447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun 1 2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31 2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17 2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24 2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25 2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25 2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25 2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26 2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb 6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25 2017 fibonacci/fibonacci-1G-performance.asm~
...
Вы можете отфильтровать каталоги, пропуская через grep -v '^d'
Иногда вы можете использовать глоб, который соответствует только файлам, а не каталогам, если ваши имена файлов имеют шаблон. например ll -rSd **/*.jpg
, или даже **/*.*
работает, если ни одно из ваших имен каталогов не имеет .
в них, и все файлы, которые вы хотите сделать.
(Для людей с опытом работы в DOS: в этом нет ничего волшебного *.*
на Unix. Это просто соответствует любой записи каталога, которая содержит буквальную точку. Но кроме исполняемых файлов и иногда текстовых файлов, обычно дается расширение имен файлов.)
@dessert указывает, что вам нужно shopt -s dotglob
для этого, чтобы соответствовать всем файлам.
С GNU find
Если не много файлов для размещения на одном ls
командная строка, find -exec ls {} +
поместит их все в командной строке, где ls
могу отсортировать их.
find -not -type d -exec ls --color -lrSh {} +
С помощью -not -type d
вместо -type f
избегает игнорирования символических ссылок, именованных каналов, сокетов, файлов устройств и всего, что у вас есть в ваших каталогах.
С du
:
du -ach | sort -h
....
4.0K x86-modedetect-polyglot.o
8.0K ascii-compress-base.asm
8.0K dizzy-integer
8.0K stopwatch-rdtsc.asm
8.0K string-exponential.asm
8.0K true-binary
12K a.out
12K bubblesort.asm
12K casexchg
12K empty-args
100K parity-party
220K fibonacci
628K total
Теперь имена каталогов сортируются в списке для суммирования всего их содержимого, но отдельные файлы по-прежнему включены.
sort -h
ака --human-numeric-sort
, сортирует числа с суффиксами размера как du -h
печать. Это идеально подходит для использования с du
,
Я часто использую du -sch * | sort -h
, или же */
чтобы получить только каталоги.
du -sch **/* | sort -h
даст вам вышеупомянутый вывод, если вы забудете, что du
имеет -a
вариант.
(Я только нашел время, чтобы найти его, потому что я публикую ответ. Для интерактивного использования, я бы, вероятно, просто использовал du -sch **/*
,