-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdirsize
executable file
·56 lines (48 loc) · 1.33 KB
/
dirsize
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use Getopt::Long;
my $sort_by_number = 0;
my $sort_by_size = 0;
my $reverse = 0;
GetOptions(
"n|sort-by-number" => \$sort_by_number,
"s|sort-by-size" => \$sort_by_size,
"reverse" => \$reverse,
);
die "Usage: ".(basename $0)." [-sort-by-number|n] [-sort-by-size|s] [-reverse|r] dir ...\n" unless @ARGV;
die "Only one sorting option can be specified.\n" if $sort_by_number && $sort_by_size;
my @dirs = @ARGV;
my %files;
my %size;
my $maxfiles = 0;
my $maxsize = 0;
foreach my $dir (@dirs) {
next unless -d $dir;
my $files = `find "$dir" -type f | wc -l`;
chomp $files;
$files{$dir} = $files;
$maxfiles = $files if $files > $maxfiles;
(my $size = `du -sb "$dir"`) =~ s/\s.*//;
chomp $size;
$size{$dir} = $size;
$maxsize = $size if $size > $maxsize;
}
if ($sort_by_number) {
@dirs = sort { $files{$a} <=> $files{$b} } @dirs;
}
if ($sort_by_size) {
@dirs = sort { $size{$a} <=> $size{$b} } @dirs;
}
@dirs = reverse @dirs if $reverse;
my $lenfiles = length(with_separators($maxfiles));
my $lensize = length(with_separators($maxsize));
foreach my $dir (@dirs) {
printf "%${lenfiles}s %${lensize}s %s\n", with_separators($files{$dir}), with_separators($size{$dir}), $dir;
}
sub with_separators {
my $x = shift;
1 while $x =~ s/(\d+)(\d{3})/$1.$2/;
return $x;
}