Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 리눅스 파일 글로빙 완벽 가이드 – 와일드카드 패턴부터 glob() 함수까지

C++에서 리눅스 파일 글로빙(Pathname Expansion) 완벽 가이드

파일 글로빙(File Globbing)은 경로명 확장(Pathname Expansion)이라고도 불리는 기능으로, 리눅스에서 와일드카드(wildcard) 패턴을 인식해 이에 해당하는 파일 경로를 찾아 확장하는 방법입니다. 셸에서 여러 파일을 한 번에 다룰 때 매우 유용하며, C++ 프로그램에서도 glob() 함수를 통해 동일한 기능을 활용할 수 있습니다.

와일드카드 패턴(Wildcard Patterns)이란?

와일드카드 패턴은 특정 규칙에 맞는 여러 파일을 한꺼번에 선택하기 위해 사용하는 문자열입니다. 물음표(?), 대괄호([]), 별표(*) 같은 문자를 조합하여 패턴 매칭과 다중 파일 선택을 수행합니다.

1. 별표(Asterisk, *)

* 패턴은 파일 이름에서 문자열 뒤에 오는 0개 이상의 임의의 문자와 일치시킬 때 사용합니다.

예시: file* 은 file, files, file1, file01처럼 file 뒤에 어떤 문자가 오거나 아무것도 오지 않는 모든 파일 이름과 일치합니다.

2. 물음표(Question Mark, ?)

? 패턴은 문자열 뒤에 오는 정확히 한 개의 문자와 일치시킬 때 사용합니다.

예시: file? 은 file1, files처럼 file 뒤에 문자가 정확히 하나인 이름은 일치하지만, file(문자 없음)이나 file01(두 문자)은 제외됩니다.

3. 대괄호(Square Brackets, [])

[] 패턴은 대괄호 안에 나열된 문자 중 정확히 하나와 일치시킬 때 사용합니다. 대괄호 안에는 개별 문자뿐 아니라 하이픈(-)으로 범위도 지정할 수 있습니다.

예시:

  • file[12] : file 뒤에 '1' 또는 '2'가 오는 이름과 일치합니다.
  • file[1-3] : file 뒤에 1~3 사이의 숫자 한 자리가 오는 이름(file1, file2, file3)과 일치합니다.

4. 부정 연산(Negation, !)

대괄호 안에서 느낌표(!)를 함께 사용하면, 지정한 집합에 포함되지 않는 문자와 일치시킬 수 있습니다. 즉, 특정 문자를 제외한 나머지를 선택하는 방식입니다.

예시: file[!0]* 은 file 뒤에 '0'이 아닌 문자가 오는 모든 파일 이름(file1, file211, files 등)과 일치하지만, file01은 제외됩니다.

리눅스 명령어로 글로빙 실습하기

실습을 위해 폴더에 다음과 같은 파일들이 있다고 가정해 보겠습니다.

file  file1  file01  file211  files

각 패턴을 ls 명령어와 함께 실행하면 다음과 같은 결과를 얻을 수 있습니다.

패턴의미매칭 결과
ls file*file 뒤에 0개 이상의 문자file, file1, file01, file211, files
ls file?file 뒤에 정확히 한 문자file1, files
ls file[12]file 뒤에 '1' 또는 '2'file1
ls file[0-9]?file 뒤에 숫자 한 개와 문자 한 개file01
ls file[!0]*file 뒤에 '0'이 아닌 문자로 시작하는 이름file1, file211, files

C++에서 glob() 함수로 글로빙 구현하기

셸 명령어뿐 아니라 C++ 코드에서도 <glob.h> 헤더의 glob() 함수를 사용해 동일한 패턴 매칭을 수행할 수 있습니다.

#include <iostream>
#include <glob.h>

int main() {
    glob_t globbuf;
    int ret = glob("file*", 0, nullptr, &globbuf);

    if (ret == 0) {
        for (size_t i = 0; i < globbuf.gl_pathc; ++i) {
            std::cout << globbuf.gl_pathv[i] << '\n';
        }
        globfree(&globbuf);
    } else if (ret == GLOB_NOMATCH) {
        std::cout << "일치하는 파일이 없습니다.\n";
    }
    return 0;
}

컴파일 후 실행하면 현재 디렉터리에서 file로 시작하는 모든 파일 목록이 출력됩니다.

g++ glob_example.cpp -o glob_example
./glob_example

glob() 함수의 두 번째 인자에는 GLOB_NOSORT(결과 정렬 생략), GLOB_BRACE(중괄호 {} 확장 허용) 같은 플래그를 비트 OR(|)로 조합해 전달할 수 있습니다. 또한 glob()이 내부적으로 할당한 메모리는 사용이 끝난 후 반드시 globfree()로 해제해야 메모리 누수를 방지할 수 있습니다.

마무리

파일 글로빙은 리눅스 환경에서 여러 파일을 효율적으로 다루기 위한 필수 개념입니다. *, ?, [] 세 가지 와일드카드와 ! 부정 연산만 익혀도 대부분의 파일 선택 작업을 손쉽게 처리할 수 있으며, C++의 glob() 함수를 활용하면 이러한 기능을 프로그램 안에서도 그대로 구현할 수 있습니다.