ディレクトリ内の項目をサイズ別にリストするBashスクリプト

ディレクトリ内の項目をサイズ別にリストするBashスクリプト

各パラメータに対して、スクリプトは、ディレクトリ内の最大のエントリとそのサイズを表示する必要があるスクリプトを作成する方法です。このような:

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

答え1

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

答え2

使用するには、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。)

答え3

シェルにはzshこれに対するサポートが組み込まれています。

#! /bin/zsh -
zmodload zsh/stat &&
for dir {
  largest=(${dir:-.}/**/*(NDOL[1]))
  (($#largest)) || largest=${dir:-.}
  zstat -A size +size -- "$largest" &&
    print -r -- $size $largest
}

答え4

# 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


説明/変更ログ

例では、サブディレクトリにあるファイルを見ることができ、extraを使用しますsort -h。ディレクトリ全体がその中に含まれるファイルよりも確かに小さくないので、結論を下します。プロジェクトファイルのみ。

この時点で、私は現在と呼ばれる元のソリューションに達しましたm_all。ソートしないとどれが最大かわからないので、元の例に追加tailパスが追加されました。

少しの修正の終わりに、これはバージョン3ですが、質問者が欲しかったので問題があります。各パラメータについて。私は以前のラッパーがまだある程度役に立たないと思い、変更を最小限にしたかったので(v4)m_allというラッパーを残して名前を変更しました。maxlsいつものように、動作を変更するためにいくつかのスイッチを残しました。その後、ご覧のようにドキュメント(v5-7)が追加されました。

ご注意くださいそれぞれ通常、すべての操作が完了した後にanyまたはを使用することはtail意味がありません。これらの出力を得るたびに使用する必要がありますsort。与えられた各ファイルの最後の数行を印刷しますが、これによりコードが非常に長くなります。sorttail

関連情報