티스토리 뷰

728x90

PHP를 웹서버에서 사용하는 것이 일반적이고 대부분의 개발자가 사용하는 형태이지만, 저의 경우에는 데스크탑이나 서버 내부의 일괄 작업에 가끔 PHP CLI를 활용해서 작업합니다. 수백개내지 수천개의 작업을 손으로 한다는 것은 일의 효율도 떨어질 뿐더러 정확성도 떨어지기 때문입니다. 이렇게 대량의 작업을 하는 경우에는 대부분 동일한 작업을 단순 반복하는 형태이므로 간단한 프로그램으로 일괄 작업하기에 아주 적당합니다. 

PHP CLI(Command Line Interface)는 PHP를 설치하면 아파치와 같은 웹서버 없이도 간편한 작업이 가능합니다. 자바처럼 컴파일도 필요없고 자바 스크립트처럼 웹브라우저를 필요로 하지도 않지만 네트워크, 데이터베이스, 파일등 왠만한 작업은 모두 가능하기 때문에 반복적인 업무를 자동화하기에는 딱인 추천할 만한 시스템입니다. 이번 포스팅은 약 1천개의 이르는 이미지 스캔 파일을 페이지를 인식할 수 있도록 파일명을 간단히 조정하는 작업을 예로 해서 PHP의 디렉토리 관련 함수와 파일 관련 함수를 다루어 볼까 합니다.


ADF(자동급지장치)가 있는 스캐너에서 양면 페이지가 있는 문서를 한면씩 스캔하면 스캐너는 이미지 파일 이름을 하나씩 증가시켜 저장하고 스캔 번호가 자체 시퀀스를 기반으로 붙이기 때문에 문서 자체의 페이지 번호와 일치하지 않는 문제점이 있습니다. 그래서 스캔 이미지가 있는 디렉토리의 파일들에 대해서 스캔 이미지 파일을 골라 페이지와 일치하는 파일명으로 수정하는 코드를 작성해 보겠습니다.

    $dir = ".";

    if ($dh = opendir($dir)) {
        while (($filename = readdir($dh)) !== false) {
            if (!preg_match('/SCAN[0-9]+\.JPG/', $filename)) continue;
            $newpage = "page".sprintf("%04d", (substr($filename, 4, 4) - 2122) * 2 + 1).".JPG";
            echo "filename: $filename --> $newpage\n";
            rename($filename, $newpage);
        }
        closedir($dh);
    }

디렉토리 정보를 읽는 함수는 opendir - readdir - closedir의 구조로 사용할 수 있습니다. opendir() 함수에는 디렉토리 정보를 읽을 경로를 전달합니다. 위의 예제 코드에서는 "."을 전달했는데 "."는 현재 디렉토리를 의미하며 윈도우나 리눅스/유닉스 모두 공통적으로 사용할 수 있습니다. ".."는 위 디렉토리를 지칭합니다. opendir()이 성공하면 핸들(예제 코드에서는 $dh)이 리턴되는데 이 핸들을 readdir()이나 closedir()함수에 사용합니다. readdir() 함수로 리턴되는 내용은 파일명만 전달되고 경로는 없기 때문에 해당 파일을 열거나 할 경우에는 경로와 파일명을 적절하게 조합해서 사용해야 합니다.

위의 코드와 같은 일괄 작업에서 주의할 점은 처음부터 파일변경, 삭제와 같은 실제 작업을 넣지 말고(주석처리 등의 방법 사용) 일단 검색 및 작업 준비 과정이 의도대로 진행되는지 사전에 점검한 다음 예상한 결과대로 준비가 모두 완료된 다음 실제 작업을 진행하도록 합니다.


위의 그림은 코드의 실제 작업이전에 검색 및 작업 준비 과정의 정확성을 사전에 점검하는 화면입니다. 일괄 작업의 성패는 사전에 적절한 규칙성을 찾아내어 적절한 작업 시나리오를 준비하고 해당 시나리오에 맞는 적절한 코드 작성과 코드의 사전 점검에 달려 있다 하겠습니다. 작업의 위험성이 있다면 물론 백업을 해두고 작업하는 것도 지혜로운 방법이라 하겠습니다.

위에서 언급한 디렉토리 정보 검색 함수외에 디렉토리 연관 PHP 함수는 아래와 같습니다.

  • chdir(디렉토리) : 지정한 디렉토리로 이동. 성공시 TRUE 리턴

  • getcwd() : 현재 작업 디렉토리가 어디인지를 문자열로 리턴합니다.

  • scandir(디렉토리) : 지정한 디렉토리의 파일 및 디렉토리 정보를 문자열 배열로 리턴합니다.

  • rewinddir(핸들) : readdir()로 디렉토리를 순차적으로 읽다가, 처음부터 다시 읽고자 할 때 사용합니다.

  • mkdir(디렉토리) : 지정한 디렉토리를 생성합니다. 성공시 TRUE 리턴

  • is_dir(디렉토리) : 지정한 이름이 존재하는 디렉토리면 TRUE 리턴

  • rmdir(디렉토리) : 지정한 디렉토리를 삭제합니다. 삭제할 디렉토리는 빈 디렉토리이어야 하며 성공시 TRUE 리턴


예제 코드에서 파일 이름 변경에 사용함 함수는 rename(옛 이름, 새 이름)으로 rename()외에 간단하게 파일을 관리할 수 있는 함수들은 아래와 같습니다.

  • unlink(파일명), delete(파일명) : 지정한 파일 삭제

  • copy(원본 파일, 대상 파일) : 원본 파일을 대상 파일로 복사합니다. 성공시 TRUE 리턴

  • is_file(파일명) : 지정한 이름이 존재하는 일반 파일이면 TRUE 리턴


위의 코드를 실행한 결과는 아래와 같습니다.



728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/03   »
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
글 보관함