특정 디렉토리 밑에 있는 파일 중에서 일정시간이 지난 파일을 삭제하고자 할 때 필요한 스크립트이다. 파일 서버를 관리하다보면, 주기적으로 필요 없는 파일들을 삭제해야 하는데, Unix(Linux) 환경에서는 find, rm 등을 조합하여 사용할 수도 있다. 그런 것이 여의치 않고, 굳이 Groovy 를 이용하려고 할 때, 활용하면 좋겠다.
final DAY_LIMIT = 2 // N일
final TARGET_DIR = "./"

println("[Deleted Files]\n")
new File(TARGET_DIR).eachFileRecurse { file ->
    if( file.file ) {
        def lastModified = new Date(file.lastModified())
        def diffDay = new Date() - lastModified
        if(diffDay > DAY_LIMIT) {
            println(lastModified.format("YYYY-mm-dd") + " : $file")
            file.delete()
        }
    }
}



파일서비스를 하다 보면, 불필요하게 비어 있는 디렉토리들이 우후죽순으로 생겨난다. 용량은 얼마 차지하지 않겠지만, 관리상 지저분한 면이 있으니, 깔끔한(?) 성격을 가진 관리자라면 이것 조차도 지우고 싶을 것이다. Windows 에서는 빈 디렉토리를 지울 수 있는 유틸리티를 이용해서 지워도 되고, Unix 계열이라면 find 를 이용해서 지울 수 있다.

다음 PHP 코드를 이용하면, 모든 OS에서 동일하게 빈 디렉토리를 삭제할 수 있다. 같은 일을 하는 코드를 찾아봤지만, 없어서 직접 구현해보았다. 간단하다, 모든 디렉토리를 순회하면서 해당 디렉토리 내에 파일/디렉토리가 있는지 검사해서 아무 것도 없으면, 삭제 대상으로 등록하고, 나중에 한방에 지우도록 한 것이다.

// -----------------------------------------
// 빈 디렉토리 삭제
// -----------------------------------------
$dst_dir  = "C:\\";
// -----------------------------------------
 
function find_empty_folder($dst_dir) 
{
    $result = array();
 
    $i = 0;
    $rdi = new RecursiveDirectoryIterator($dst_dir);
    try {
        foreach (new RecursiveIteratorIterator($rdi, 
            RecursiveIteratorIterator::SELF_FIRST, 
            RecursiveIteratorIterator::CATCH_GET_CHILD) as $path) {
 
            if ($path->isDir()) {
                if(2 == count(scandir($path->__toString()))) {
                    $result[$i++] = $path->__toString();
                }
            }
        }
    } catch(Exception $e) {
        echo "Message: ".$e->getMessage();
    }
 
    return $result;
}
 
 
$list_empty_folder = find_empty_folder($dst_dir);
 
foreach($list_empty_folder as $empty_folder) {
    echo $empty_folder."\n";
    unlink($empty_folder);
}

+ Recent posts