Рейтинг:-2

Получение общего размера моих пяти самых больших файлов в bash

флаг lr

Я пытаюсь получить общий размер пяти самых больших файлов, найденных в каталоге, но мне не удается работать в моем списке. У меня есть два способа поиска и сортировки пяти самых больших файлов.

#!/бин/баш

DIR=$1 #Путь к начальному каталогу


если [ ! -d "$DIR" ]; то #если каталог не найден
    echo "Каталог не существует!" 
    выход 1
фи

echo "Пять самых больших файлов, использующих ls:"
test_ls=$( ls -lhR "$DIR" | grep '^-' | sort -r -k 5 -h | head -n 5 )
du -ch "$test_ls"


echo "Пять самых больших файлов, использующих find/DU:"
test_find=$( find "$DIR" -type f -exec du -ch {} + | sort -rh | head -n 5 )
du -ch "$test_find"

echo "Общее количество файлов: "
ls -lhR "$DIR" | grep '^-' | туалет -л
echo "Общий размер файлов: "
du -sh "$DIR" | awk '{напечатать $1}'

Если я применяю du к переменной ls, я получаю:

du: недопустимая опция -- 'r'
du: недопустимая опция -- 'w'
du: недопустимая опция -- '-'
du: недопустимая опция -- 'r'

и если я применю его к переменной поиска, я получу это для каждого из пяти файлов.

du: невозможно получить доступ к «429M»: нет такого файла или каталога

И версия ls, и версия find отлично работают для перечисления пяти самых больших файлов в данном каталоге, но я действительно теряюсь в том, как я могу сложить их размеры вместе.

флаг hr
Это обязательно должен быть баш? Например, оболочка zsh может сортировать и выбирать файлы по размеру напрямую, например. `du -hc **/*(.NDOL[1,5])`
Рейтинг:1
флаг in

Не уверен, как лучше исправить ваш код, я бы предложил другой подход без необходимости дю как найти может возвращать размеры файлов с помощью -printf '%s'.

Отметим также, что вы никогда не должны анализировать лс и что найти в отличие лс будет работать рекурсивно, если вы не ограничите это с помощью -Максимальная глубина вариант.


Это найдет пять самых больших файлов в каталоге и суммирует их размеры:

find "$DIR" -maxdepth 1 -type f -printf '%s\n' | сортировать - номер | голова -n5 | вставить -sd+ | до н.э. | numfmt --to=iec
  • найти... -printf '%s\n' будет печатать размеры файлов в байтах
  • | сортировать - номер | голова -n5 найдет пять самых больших чисел
  • | вставить -sd+ соединит числа со знаком плюс между ними, так что это математическое выражение
  • | До нашей эры запустит математическое выражение
  • | numfmt --to=iec (необязательно) преобразует размер из байтов в удобочитаемый формат.

Чтобы получить дополнительную информацию, вы можете сохранить найти вывод напр. в массиве:

DIR=/некоторые/дир
file_sizes=($(найти "$DIR" -maxdepth 1 -type f -printf '%s\n' | sort -nr))

num_files=${#file_sizes[@]}
total_size=$(IFS=+; echo "$((${file_sizes[*]}))" | numfmt --to=iec)
самые большие_файлы=$(IFS=+; echo "$((${file_sizes[*]:0:5}))" | numfmt --to=iec)

printf 'Общее количество файлов: %d\nОбщий размер файлов: %s\nРазмер самых больших 5: %s\n' $num_files $total_size $biggest_files

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.