Perl에서 더 좋은 모듈을 발견하지는 못해서, 일일이 파일 사이즈를 모두 더해서 폴더 사이즈를 구하였다. 그래서 시간이 좀 걸린다.

첫번째 방법
use v5.10;
use strict;
use warnings;

use File::Find;

sub get_folder_size {
    my ($dst_folder) = @_;
    my $folder_size = 0;
    find( sub { $folder_size += -f $_ ? -s _ : 0 }, $dst_folder );

    return $folder_size;
}

say "Folder Size : ".get_folder_size("C:\\");


두번째 방법

# ------------------------------------------------------------------------------
# 필요한 모듈 : cpanm -n File::Find::Object 
# ------------------------------------------------------------------------------
use v5.10;
use strict;
use warnings;

use File::Find::Object;

sub get_folder_size {
    my ($dst_folder) = @_;
    my $folder_size = 0;

    my $tree = File::Find::Object->new({}, ($dst_folder));
    while(my $file = $tree->next()) {
        next unless -e $file; # 존재하지 않으면 다음
        next unless -f $file; # 일반파일이 아니면 다음
        next unless -r $file; # 
        next unless -R $file; # 
        $folder_size += -s $file;
    }

    return $folder_size;
}

say "Folder Size : ".get_folder_size("C:\\");


NetBSD 의 커널을 컴파일하는 방법을 정리해보았다. 같은 BSD 계열이라서 FreeBSD 와도 많이 비슷한 면이 있다. 커널 설정 파일 생성하기

 
# cd /usr/src/sys/arch/i386/conf/
# cp GENERIC MYKERNEL

커널 수동 빌드
# config MYKERNEL
# cd ../compile/MYKERNEL
# make depend
# make

build.sh 를 사용하여 커널 빌드하기
# cd /usr; mkdir obj; chown root:wsrc obj
# cd /usr/src
# ./build.sh tools
# ./build.sh kernel=MYKERNEL

새로운 커널 설치하기
# mv /netbsd /netbsd.old
# cd /usr/src/sys/arch/i386/compile/obj/MYKERNEL
# mv netbsd /

# shutdown -r now



'OS > BSD' 카테고리의 다른 글

FreeBSD 10.0 설치후 작업  (0) 2014.01.22
NetBSD 설치후 작업  (0) 2013.03.02

Ruby 버전에 이어서 Groovy 버전도 만들어보았다. 거의 생김새가 비슷한 언어여서, 몇가지만 수정하면 바로 동작한다.

def FOLDER_LIST = [
                    "/path/to1",
                    "/path/to2",
                    "/path/to3",
                    "/path/to4",
                    "/path/to5",
                  ]

def startDate = new Date().format('yyyy/MM/dd HH:mm:ss')

def size_folder_list = []
FOLDER_LIST.each { folder_name ->
    def folder_size = 0
    new File(folder_name).eachFileRecurse { path ->
        folder_size += path.size()
    }
    size_folder_list << "${folder_size}|${folder_name}"
}

size_folder_list = size_folder_list.sort { a, b ->
    (a_size, a_file) = a.split(/\|/)
    (b_size, b_file) = b.split(/\|/)
    // b_size as int <=> a_size as int
    b_size.toInteger() <=> a_size.toInteger()
}

size_folder_list.each { folder ->
    (f_size, f_path) = folder.split(/\|/)
    println("${f_size},${f_path}")
}


def endDate = new Date().format('yyyy/MM/dd HH:mm:ss')
println "\n\n\n"
println "================================================================================"
println "Start Time : $startDate"
println "End   Time : $endDate"
println "================================================================================"

다음은 특정 디렉토리 아래에 있는 파일 중에서 200MB 넘는 파일을 찾아서, 크기로 정렬하여 출력하는 프로그램이다. 어려운 것은 아니지만, 필요할 때 찾아보면 좋을 듯 하여~ ^^

# -*- coding: cp949 -*-
require 'find'

$TARGET     = "C:\\"
$SIZE_LIMIT = 200_000_000

start_time = Time.now

puts "Script Start..."
puts "=========================================================================\n\n"

file_list = Array.new
Find.find($TARGET) do |path|
  if File.file?(path) and File.size(path) > $SIZE_LIMIT
    file_size = File.size(path)
    file_list << file_size.to_s + "|" + path
  end
end


file_list = file_list.sort do |a, b| 
  (a_size, a_file) = a.split(/\|/)
  (b_size, b_file) = b.split(/\|/)
  b_size.to_i <=> a_size.to_i
end


file_list.each do |file|
  (f_size, f_path) = file.split(/\|/)
  print f_size + " -> " + f_path + "\n"
end


end_time = Time.now


puts "\n\n========================================================================="
puts "Start Time : #{start_time}"
puts "End Time   : #{end_time}"

puts "Script End..."

+ Recent posts