Как найти n самых больших файлов в папке?

Как найти n самых больших файлов в папке, кроме файлов из первой папки?

В этом примере для n = 2 :

dir
--file 50KB
--dir1
--dir2
----file2_1.txt (size 25KB)
--dir3
----dir3_1
------file3_1.txt (size 35KB)
------file3_2 (size 25KB)

Результат:

dir/dir3/dir3_1/file3_1.txt 35KB
dir/dir2/file2_1.txt 25KB
7
задан 19 November 2020 в 23:17

4 ответа

find . -mindepth 2 -printf "%s\t%p\n" | sort -n | cut -f 2- | tail -n $n

Здесь самый большой файл идет последним. Если вы хотите изменить порядок, чтобы сначала был самый большой файл:

find . -mindepth 2 -printf "%s\t%p\n" | sort -nr | cut -f 2- | head -n $n
# .............................................^...............^^^^

С помощью набора инструментов GNU вы можете обрабатывать имена файлов, содержащие символы новой строки (раздражающие, но допустимые):

find . -mindepth 2 -printf "%s\t%p\0" | sort -znr | cut -zf 2- | head -zn $n

И чтобы получить желаемый результат, вы можете сделать:

find . -mindepth 2 -printf "%s\t%p\n" |
  sort -nr |
  head -n 5 |
  perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane '
    push @F, format_bytes(shift @F);
    print join "\t", @F;
  '

Использование модуля perl Number :: Bytes :: Human из CPAN.

6
ответ дан 3 January 2021 в 22:49
# find . -type f -exec du -s {} \; | sort -h -t1 | tail -n 10

кто короче? Кстати - в версии Ларссона - используется только каталог cur ... не в счет.

В любом случае, если бы вы ограничили уровень, вы могли бы ограничьте его find -maxdepth

например

# find  . -maxdepth 1 -type f -exec du -s {} \; | sort -h -t1 | tail -n 10

Если вы хотите исключить первый уровень, вы можете использовать mindepth 2 , maxdepth независимо от ...

1
ответ дан 3 January 2021 в 22:49

Сверху моей головы:

ls -lsR * | awk '{print $6,$10}'| sort -nr | head -n5
2
ответ дан 3 January 2021 в 22:49

Хотя вы отметили свой вопрос bash , вот решение zsh на тот случай, если другие сочтут его полезным.

Учитывая

% tree -h dir
dir
├── [ 512]  dir1
├── [ 512]  dir2
│   └── [ 25K]  file2_1.txt
├── [ 512]  dir3
│   └── [ 512]  dir3_1
│       ├── [ 35K]  file3_1.txt
│       └── [ 25K]  file3_2.txt
└── [ 50K]  file

4 directories, 4 files

, затем использование zsh с квалификаторами glob :

% print -RC1 dir/*/**/*(.OLon[1,2])
dir/dir3/dir3_1/file3_1.txt
dir/dir2/file2_1.txt

, где

  • dir / * / гарантирует, что мы запускаем по крайней мере 1 каталог ниже ] dir , эквивалент find s -mindepth

  • ** / * - это глобус оболочки, который соответствует рекурсивно (то же самое доступно в bash , если установлен параметр globstar )

  • () включает набор квалификаторов, в частности

    • . соответствует только обычным файлам (эквивалент find -type f )
    • OL упорядочивает результаты по размеру ( L ength) по убыванию, а на разрывает связи на n по возрастанию
    • [1,2] выбирает диапазон результатов

В отличие от find , глобусы оболочки обычно пропускают скрытые файлы по умолчанию - если вы хотите их включить, добавьте D к квалификаторам, т.е. (. DOLon [1,2])

5
ответ дан 3 January 2021 в 22:49

Другие вопросы по тегам:

Похожие вопросы: