Скрипт Bash на текущую директорию

Необходимо написать скрипт на Bash чтобы - он выводил по 10 результатов содержимого директории включая файлы и папки с сортировкой размеров от большего к меньшему, вдобавок чтобы был последующий запрос если содержимого больше 10 элементов, скрипт предлагал вывести последующие 10 результатов. Попытался что-то написать но вывод только папок:

du -h -Bm --max-depth=1 | sort -nr | head -n11
echo "Вывести оставшееся содержимое?Y/N"
read bool
if [ $bool = Y ]; then
    du -h -Bm --max-depth=1 | sort -nr | more +12
fi

Ответы (1 шт):

Автор решения: Алексей Р

Первая версия была в корне неправильной :) - ls вообще не годится для этих целей. Переписал по-другому.

#!/bin/bash

clear

p=~/bash # путь к целевому каталогу
cd "${p}" # сделать указанный каталог текущим

# прочесть содержимое текущего каталога - файлы и подкаталоги (но не включая . - родительский каталог),
# отсортировать по убыванию размера файла/каталога и отрезать первую часть строк (где размер файла/каталога)
files=$(find -mindepth 1 -maxdepth 1 -printf '%s %f\n' | sort -nr | cut -d' ' -f2-)

IFS=$'\n' # временной определить внутренний разделитель полей как новая строка
# прочесть все строки в массив array
while read -r line; do
    array+=("$line") 
done <<< "$files"
unset IFS # вернуть дефолтное значение

len=${#array[@]}
chunk_size=7 # количество выводимых строк за один раз
start=0 counter=1 # задаем стартовый индекс в массиве и счетчик файлов/подкаталогов
while : # бесконечный цикл while
do
    chunk=("${array[@]:$start:$chunk_size}") # берем первую партию имен - делаем срез массива
    for fname in "${chunk[@]}" ; do # перебираем первую партию имен
        if [[ -d $fname ]]; then # определяем тип
            type="каталог"
            fsize=$(du --apparent-size -b "$fname" | cut -d\t -f1 | sed -e 's/[\t]//') # получаем размер каталога (с учетом размера самого каталога и содержимого), обрезаем справа путь и удаляем символ табуляции
        else
            type="файл"
            fsize=$(stat -c%s "$fname") # получаем размер файла
        fi
        echo $counter: "$fname [$type, $fsize байт(а,ов)]" # выводим в консоль
        let "counter++" # инкрементируем счетчик
    done
    let "start+=chunk_size" # передвигаем указатель на следующую партию имен
    if [ $start -ge $len ]; then break; fi # если указатель в конце массива, то выходим из цикла - больше выводить нечего
    read -p "Вывести оставшееся содержимое (y/n)?: " resp # спрашиваем
    if [ -z $resp ] || [ $resp != y ]; then break; fi # если ответ пустой (просто нажали Enter) или не y, то выходим из цикла
done

1: test [каталог, 4461 байт(а,ов)]
2: ls5.sh [файл, 2785 байт(а,ов)]
3: ls4.sh [файл, 1913 байт(а,ов)]
4: ls3.sh [файл, 498 байт(а,ов)]
5: result.txt [файл, 363 байт(а,ов)]
6: Shared.txt2 [файл, 254 байт(а,ов)]
7: ls2.sh [файл, 250 байт(а,ов)]
Вывести оставшееся содержимое (y/n)?: y
8: shopt1.sh [файл, 190 байт(а,ов)]
9: ls1.sh [файл, 148 байт(а,ов)]
10: Новый текстовый файл.txt [файл, 0 байт(а,ов)]
admin1@astra:~/bash$ 
→ Ссылка