Как найти 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
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.
# 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 независимо от
...
Сверху моей головы:
ls -lsR * | awk '{print $6,$10}'| sort -nr | head -n5
Хотя вы отметили свой вопрос 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])