Сценарий 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 выводит последние строки для каждого указанного файла, но это сделает код очень длинным.

  • Сценарий Bash для обнаружения загруженных файлов триггеров много раз для одного файла
  • Как создать список элементов под определенными заголовками в текстовом документе? (Linux / Bash)
  • Почему мой cronjob не выполняет мой shell-скрипт?
  • Как правильно использовать $ _ внутри скрипта tcsh, полученного из другого tcsh-скрипта?
  • Если #head versionnumber.txt <#head lastversionnumber.txt, то: сделайте это
  • В bash вместо создания новой строки изменения уже сделанной строки
  • Инвертировать результаты для "for in * do" -loops
  • Сценарий оболочки Crontabbed, не способный создавать / записывать в файл
  • perl one liner + как соответствовать IP-адресу, который находится в поле файла first / sec
  • Сценарий зависает после входа в zenity
  • Как проверить, были ли созданы предупреждающие баннеры в сценарии оболочки
  • Interesting Posts

    Соединение отклонено на порт 8081, используя завиток

    Как правильно обрабатывать локально созданные двоичные файлы?

    Как работает встроенная структура управления / перенаправления Bash

    Использование переменных при определении псевдонимов в bashrc

    Как запускать параллельные процессы и комбинировать выходные данные, когда оба завершены

    Как использовать специальную библиотеку для определенных программ?

    Какова команда поиска файла jar в определенной папке?

    Как проверить, существует ли $ date1 до $ date2 в оболочке?

    zfs-fuse: включение сжатия не влияет

    Что должен знать каждый эксперт?

    \ uFFFD символ в имени каталога

    Как создать список, сгенерированный md5deep в алфавитном порядке относительных путей?

    Что означает «хэширование» при использовании команды типа?

    Продолжительность / proc / pid / stat

    Не удалось запустить обновление yum для виртуализованного центра сертификации

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