Скрипт 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$