Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

시스템 관리를 하다보면, 하위 디렉토리의 특정 종류의 파일에 대해서 일괄작업을 해야 하는 경우가 있다. 이를테면 크기가 얼마 이상인 파일을 지워야 한다거나, 파일의 날짜를 변경시켜야 한다거나 하는 등등의 일이다. 노가다를 뛰는 방법도 있겠지만 자고로 시스템 관리자의 미덕은 게으름 아니던가. 스크립트 하나 잘 만들어 두면, 한시간 해야 할일을 1분에 끝낼 수 있다. 다음은 모든 디렉토리의 권한을 변경하기 위한 스크립트로 find(1)를 어떻게 사용하느냐에 따라서 다양한 응용을 할 수 있을 것이다.

find(1)를 이용해서 파일의 리스트를 얻어온다. C(:12) 언어라면 stat() 함수를 이용해야지만 파일의 종류를 알아낼 수 있겠지만 perl 은 -x를 이용해서 간단하게 파일을 테스트 할 수 있다. 다음은 파일테스트에 사용할 수 있는 연산자들이다.
  • -r
effective uid/gid 에 대해서 읽을 수 있는 파일
  • -w
effective uid/gid 에 대해서 쓸 수 있는 파일
  • -x
effective uid/gid 에 대해서 실행가능한 파일.
  • -o
effective uid 에 대해서 파일을 소유

  • -R
실제 uid/gid에 대해서 읽을 권한이 있는 파일
  • -W
실제 uid/gid에 대해서 쓰기 권한이 있는 파일
  • -X
실제 uid/gid에 대해서 실행권한이 있는 파일
  • -O
실제 uid에 대해서 소유하고 있는 파일

  • -e
파일이 존재하는가
  • -z
파일의 크기가 0인가
  • -s
파일의 크기가 0이 아닌가 (크기를 리턴한다.)
  • -f
일반 파일인지
  • -d
디렉토리 인지
  • -l
심볼릭 링크(:12)인지
  • -p
named pipe(:12) 인지
  • -S
socket(2) 파일인지
  • -b
블럭 파일인지
  • -c
문자장치 파일인지
  • -T
ASCII(:12) 문자 파일인지
  • -B
이진(binary) 파일인지

perl 대신 shell(:12) 스크립트를 이용할 수 도 있을 것이다.
#!/usr/bin/perl

use File::stat;

open(FD, "find ./|") || die "execute error";

while($line = <FD>)
{
        $file = trim($line);
        if (-d $file)
        {
                chmod 0755, $file;
        }
}

sub trim($)
{
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}