Сценарий Bash для перечисления элементов в каталоге по размеру

Как написать скрипт для каждого аргумента, сценарий должен отображать самый большой элемент в каталоге вместе с его размером. Что-то вроде этого:

[user]$ maxls /boot 2> /dev/null | sort -n 1024 /boot/grub2/themes/stars 8101 /boot/grub2/pic.png 

4 Solutions collect form web for “Сценарий Bash для перечисления элементов в каталоге по размеру”

 #!/bin/sh for dir do [ -d "$dir" ] || continue du -hs "$dir"/* | sort -hr | sed 1q done 

Используя perl я бы сделал что-то вроде этого:

 #!/usr/bin/env perl use strict; use warnings; use File::Find; my %biggest_file_in; my %biggest_file_size_in; sub max_in_path { my ($dir) = @_; return unless -f; if ( -s > ( $biggest_file_size_in{$dir} // 0 ) ) { $biggest_file_in{$dir} = $File::Find::name; $biggest_file_size_in{$dir} = -s; } } my ($path_to_search) = @ARGV; die "Specify a path" unless $path_to_search; foreach my $dir ( glob("$path_to_search/*") ) { next unless -d $dir; find( sub { max_in_path($dir) }, $dir ); print $dir, ":", $biggest_file_in{$dir}, " =>", $biggest_file_size_in{$dir}, "\n"; } print "Largest files in individual directories (sorted):\n"; foreach my $dir ( sort { $biggest_file_size_in{$b} <=> $biggest_file_size_in{$a} } keys %biggest_file_size_in ) { print "$dir $biggest_file_in{$dir} $biggest_file_size_in{$dir}\n"; } 

Примечание. Работает для всех каталогов в указанной директории. (например: myfind.pl /data будет искать /data/* – но игнорировать любые файлы, присутствующие в /data );

Оболочка zsh имеет встроенную поддержку для этого:

 #! /bin/zsh - zmodload zsh/stat && for dir { largest=(${dir:-.}/**/*(NDOL[1])) (($#largest)) || largest=${dir:-.} zstat -A size +size -- "$largest" && print -r -- $size $largest } 
 # m_all [dir=.]...: lists the biggest file in *all* the directories. # du options can be specified using $DU_OPTS; the recommend value is '-h'. m_all(){ find "$@" -type f -print0 | du $DU_OPTS --files0-from=-; } # maxls: for each argument, list the biggest $maxls_n items. # If $maxls_n is undefined or empty, use 1. # Additional arguments to pass to m_all can be defined in the array mallargs; see examples below. maxls(){ local i; for i; do m_all "$i" "${mallargs[@]}" | sort -h | tail -n "${maxls_n:-1}"; done; } #_Example: # list the biggest file for /bin and /usr respectively maxls /bin /usr # list the biggest 5 files for /home and /root maxls_n=5 maxls /home /root # Let maxls count only *.avi, *.svg and *.mp4: mallargs=(-iregex '.*\.\(avi\|svg\|mp4\).*') # And run it against ~/Anime maxls ~/Anime; mallagrs=() # clear that setting # And use m_all to list the biggest five logs: DU_OPTS=-h m_all /var -name '*.log*' | sort -h | tail -n 5 

И вы даже можете добавить фильтры для find !

Изменить : добавлено для каждого. Спасибо RobertL за это. И документация.

Если вы хотите, чтобы это как скрипт, создайте новый файл, который говорит #!/bin/bash , скопируйте эти строки с помощью (){ в него и добавьте maxls "$@" . Лично мне не нравится заполнять мой ~/bin супер-тривиальными скриптами.


Объяснение / изменения

Из примера мы можем видеть файлы в subdirs, и вещь вызывается с дополнительным sort -h . Поскольку весь каталог определенно не меньше, чем файлы, содержащиеся в нем, я заключаю, что элементы ограничены только файлами.

С этого момента я получил начальное решение, которое теперь называется m_all . Мы не можем знать, какие из них самые большие, если мы не сортируем их, поэтому в первоначальном примере был добавлен дополнительный tail проход.

С некоторыми исправлениями это версия 3, но это ошибка, так как искатель хочет для каждого аргумента . Я переименовал его в m_all , оставив обертку с именем maxls так как я предполагаю, что старый все еще используется, и я хочу свести к минимуму мои изменения (v4). Как я всегда делаю, я оставил несколько переключателей, чтобы изменить свое поведение. После этого, как видите, добавлена ​​документация (v5-7).

Имейте в виду, что с помощью поведения foreach обычно бессмысленно использовать любой tail или sort после того, как все будет сделано. Вы должны использовать sort каждый раз, когда получаете эти результаты. tail выводит последние строки для каждого указанного файла, но это сделает код очень длинным.

  • Как использовать переменную для строки кода скрипта?
  • Как использовать переменные в команде sed
  • Bash: Почему используется eval и shift в скрипте, который анализирует аргументы командной строки?
  • Команды X не начинаются с моей работы
  • Как создать сценарий переключения вывода xrandr?
  • Как сделать bash встроенным «read» игнорировать прокомментированные или пустые строки?
  • squid access.log удалить записи старше 6 месяцев
  • скрипт задает вывод команды переменной
  • Проблемы при попытке выполнить sh-файл из другого sh-файла
  • Запустить vino-сервер в Ubuntu 16.04 lts
  • Переименование нескольких каталогов, вставляемых между
  • Interesting Posts

    Самый быстрый способ определить, содержат ли два отсортированных списка уникальные элементы

    Отладка вне памяти с помощью / var / log / messages

    Как настроить systemd для активации зашифрованного файла подкачки?

    Автоматизация создания сертификатов OpenSSL, подписка Let'sEncrypt и связывание dir сайта в среде Nginx

    Есть ли программное обеспечение, основанное на `strictatime`?

    Управление другими системными модулями пользователя

    Как узнать имена переменных для debconf-set-selections?

    Изменение типа учетной записи пользователя от администратора до стандартного

    Как отладить файл .desktop?

    Запуск Gentoo с внешнего жесткого диска

    Сделать запуск программы на втором виртуальном рабочем столе (XFCE)

    Не удалось добавить новое соединение: (2) Требуется «беспроводная» настройка с действительным SSID, если не был задан путь доступа к сети

    (Vim) Как использовать TAB для отступов во всех типах файлов?

    Преобразование ссылок загруженного веб-сайта

    Помещение файлов в порядке возрастания (не на основе временной метки) в Unix

    Linux и Unix - лучшая ОС в мире.