Вывод списка файлов в каталоге, включая содержимое подпапок с сортировкой

Вывод списка файлов в каталоге, включая содержимое подпапок с сортировкой

Я хочу получить список всего содержимого каталога, включая содержимое подпапок, но отсортированного по размеру файла. До сих пор мне удалось дойти до списка и сортировки, при этом оставаясь рекурсивным с ls -lhSR( hнеплохо иметь, но определенно не обязательно для меня, пока я могу получить размеры файлов). Я, вероятно, упускаю из виду что-то очевидное или прошу невозможного, но любой совет здесь был бы очень признателен.

решение1

Вы можете использовать find:

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)

решение2

Поскольку вы не указали конкретную оболочку, вот альтернатива с использованием квалификаторов zsh glob с помощью

setopt extendedglob

для рекурсии. Тогда например:

  1. рекурсивно перечислить простые файлы:

    printf '%s\n' **/*(.)
    
  2. рекурсивно перечислить простые файлы,озаказалвсгибаниеЛдлина (т.е. размер):

    printf '%s\n' **/*(.oL)
    
  3. рекурсивно перечислить простые файлы,Озаказалдеразмер биговки:

    printf '%s\n' **/*(.OL)
    
  4. рекурсивно перечислить простые файлы, упорядоченные по убыванию размера, и выбрать 3 лучших результата:

    printf '%s\n' **/*(.OL[1,3])
    

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

du -hb **/*(.OL[1,3])

решение3

При globstarустановленной опции shell вы можете использовать подстановку shell:

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

решение4

Для быстрого интерактивного использованияна не слишком больших деревьях каталогов,shopt -s globstarдействительно хорошо. Глобал не может отфильтровывать каталоги по типу, но если вы используете его с ls -dthen, 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чтобы он соответствовалвсефайлы.


С GNUfind

Если файлов не так много, чтобы поместиться в одной 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 **/*.

Связанный контент