POSIX 표준은 Unix 계열 시스템의 호환성을 유지하기 위해 정의된 프로그래밍 인터페이스입니다. 이 표준은 파일 시스템을 효율적으로 탐색할 수 있는 함수인 ftw
와 nftw
를 제공합니다. 이 함수들은 디렉토리 트리 구조를 재귀적으로 탐색하며, 파일 관리, 백업, 모니터링 등 다양한 작업에 활용됩니다. 본 기사에서는 ftw
와 nftw
의 개념과 사용법, 두 함수 간의 차이점, 코드 예제, 그리고 활용 사례를 살펴보며 POSIX 파일 시스템 탐색의 핵심을 이해할 수 있도록 도와드립니다.
POSIX 표준에서의 파일 시스템 트리란?
POSIX 표준에서 파일 시스템 트리는 디렉토리와 파일의 계층적 구조를 의미합니다. 루트 디렉토리(/
)를 최상위로 하여, 하위 디렉토리와 파일들이 나뭇가지처럼 연결된 형태를 이룹니다.
파일 시스템 트리의 역할
파일 시스템 트리는 데이터 저장소를 논리적으로 구성하여 효율적인 파일 접근과 관리를 가능하게 합니다. POSIX 표준은 이러한 구조를 탐색하고 조작할 수 있는 다양한 API를 제공합니다.
POSIX에서의 트리 탐색
POSIX는 디렉토리 내 파일과 하위 디렉토리를 처리하기 위한 기능을 제공합니다. 특히, ftw
와 nftw
함수는 재귀적으로 트리를 탐색하며 파일별 작업을 수행할 수 있는 강력한 도구입니다.
파일 시스템 트리의 구조적 이해
- 루트 디렉토리: 파일 시스템의 최상위 디렉토리(
/
). - 하위 디렉토리: 루트나 다른 디렉토리 아래에 포함된 디렉토리들.
- 파일: 디렉토리에 포함된 개별적인 데이터 단위.
POSIX 표준에서의 파일 시스템 트리는 유닉스 기반 시스템 관리 및 개발에서 핵심적인 역할을 합니다. ftw
와 nftw
를 활용하면 이 트리를 효율적으로 탐색하고 필요한 작업을 수행할 수 있습니다.
ftw 함수 개요와 사용법
ftw
(File Tree Walk)는 POSIX 표준에서 제공하는 함수로, 파일 시스템 트리를 재귀적으로 탐색하며 각 파일이나 디렉토리에 대해 특정 작업을 수행할 수 있습니다. 이 함수는 디렉토리 내 모든 항목을 처리하고, 사용자가 정의한 함수 포인터를 호출하여 작업을 수행합니다.
ftw 함수의 시그니처
#include <ftw.h>
int ftw(const char *dirpath,
int (*fn)(const char *fpath, const struct stat *sb, int typeflag),
int nopenfd);
dirpath
: 탐색을 시작할 디렉토리 경로.fn
: 각 파일이나 디렉토리에 대해 호출할 사용자 정의 함수.nopenfd
: 동시에 열릴 수 있는 최대 파일 디스크립터 수.
사용법
- 디렉토리 경로 지정: 탐색 시작 지점을 지정합니다.
- 콜백 함수 정의: 파일이나 디렉토리별로 수행할 작업을 정의한 함수입니다.
- ftw 호출: 함수 호출로 디렉토리 트리를 탐색합니다.
콜백 함수의 형태
콜백 함수는 다음과 같은 시그니처를 가집니다:
int callback(const char *fpath, const struct stat *sb, int typeflag);
fpath
: 현재 파일의 경로.sb
: 파일의 메타데이터를 담은stat
구조체 포인터.typeflag
: 파일 유형(예:FTW_F
는 파일,FTW_D
는 디렉토리).
예제 코드
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
int print_file_info(const char *fpath, const struct stat *sb, int typeflag) {
printf("Path: %s, Type: %d\n", fpath, typeflag);
return 0; // 계속 탐색
}
int main() {
const char *start_dir = "./test_dir";
if (ftw(start_dir, print_file_info, 10) == -1) {
perror("ftw");
exit(EXIT_FAILURE);
}
return 0;
}
ftw 함수의 특징
- 재귀적 탐색을 자동화하여 코드 단순화.
- 최대 파일 디스크립터 수(
nopenfd
)를 조정해 시스템 자원을 효율적으로 활용. - 콜백 함수로 유연한 작업 수행 가능.
ftw
는 간단한 파일 트리 탐색에 유용하지만, 확장성 측면에서는 nftw
함수가 더 강력한 옵션을 제공합니다.
nftw 함수 개요와 사용법
nftw
(New File Tree Walk)는 POSIX 표준에서 제공하는 함수로, ftw
의 확장된 버전입니다. 추가적인 옵션과 유연성을 제공하며, 대규모 파일 시스템 트리를 탐색하거나 고급 작업을 수행하는 데 적합합니다.
nftw 함수의 시그니처
#include <ftw.h>
int nftw(const char *dirpath,
int (*fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf),
int nopenfd,
int flags);
dirpath
: 탐색 시작 지점의 디렉토리 경로.fn
: 각 파일이나 디렉토리에 대해 호출될 사용자 정의 콜백 함수.nopenfd
: 동시에 열릴 수 있는 파일 디스크립터의 최대 수.flags
: 탐색 동작을 제어하는 플래그.
콜백 함수의 형태
콜백 함수는 다음과 같은 시그니처를 가집니다:
int callback(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf);
fpath
: 현재 파일의 경로.sb
: 파일의 메타데이터를 담은stat
구조체 포인터.typeflag
: 파일 유형(예:FTW_F
는 파일,FTW_D
는 디렉토리).ftwbuf
: 추가 정보를 포함한 구조체(level
,base
등).
flags 옵션
FTW_PHYS
: 심볼릭 링크를 따라가지 않음.FTW_MOUNT
: 동일한 파일 시스템만 탐색.FTW_DEPTH
: 디렉토리의 하위 항목부터 처리(후위 탐색).FTW_CHDIR
: 탐색 중 현재 작업 디렉토리를 변경.
예제 코드
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
int print_file_info(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
printf("Path: %s, Type: %d, Depth: %d\n", fpath, typeflag, ftwbuf->level);
return 0; // 계속 탐색
}
int main() {
const char *start_dir = "./test_dir";
if (nftw(start_dir, print_file_info, 10, FTW_PHYS) == -1) {
perror("nftw");
exit(EXIT_FAILURE);
}
return 0;
}
nftw 함수의 특징
- 확장성:
ftw
에 비해 플래그를 통해 동작을 세밀히 제어 가능. - 심볼릭 링크 처리: 심볼릭 링크를 따라가거나 무시할 수 있는 옵션 제공.
- 파일 시스템 제약: 동일 파일 시스템 내 탐색 제한 가능.
- 하위 디렉토리 우선 탐색: 후위 탐색 기능을 통해 특정 작업에 유용.
nftw의 활용 사례
- 대규모 파일 시스템의 백업 및 정리.
- 디렉토리 구조에서 특정 조건에 맞는 파일 필터링.
- 디버깅 및 파일 시스템 검사.
nftw
는 유연성과 기능성에서 ftw
를 능가하며, 복잡한 파일 시스템 작업을 수행할 때 특히 유용합니다.
ftw와 nftw 함수의 차이점
ftw
와 nftw
는 모두 POSIX 표준에서 파일 시스템 트리를 탐색하기 위한 함수지만, 기능과 유연성 측면에서 몇 가지 중요한 차이점이 있습니다.
1. 함수 시그니처의 차이
- ftw:
int ftw(const char *dirpath,
int (*fn)(const char *fpath, const struct stat *sb, int typeflag),
int nopenfd);
ftw
는 간단한 콜백 함수 구조를 사용하며, 파일의 기본 정보만 제공합니다.
- nftw:
int nftw(const char *dirpath,
int (*fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf),
int nopenfd,
int flags);
nftw
는 추가 정보를 담은 FTW
구조체와 동작을 제어하는 플래그를 제공합니다.
2. 심볼릭 링크 처리
- ftw: 심볼릭 링크를 자동으로 따라갑니다.
- nftw:
FTW_PHYS
플래그를 사용해 심볼릭 링크를 무시할 수 있습니다.
3. 후위 탐색 지원
- ftw: 항상 전위 탐색(부모 디렉토리를 먼저 처리).
- nftw:
FTW_DEPTH
플래그를 사용해 후위 탐색(하위 항목부터 처리)을 지원합니다.
4. 추가 정보 제공
- ftw: 기본적인 파일 경로와 메타데이터만 제공합니다.
- nftw:
FTW
구조체를 통해 디렉토리 깊이(level
)와 파일 이름의 기본 위치(base
) 같은 추가 정보를 제공합니다.
5. 동작 제어 플래그
- ftw: 플래그 옵션이 없습니다.
- nftw:
FTW_PHYS
,FTW_DEPTH
,FTW_MOUNT
등 다양한 플래그를 통해 동작을 세밀히 제어할 수 있습니다.
6. 사용 사례 비교
- ftw:
간단한 디렉토리 탐색이나 파일 목록 생성을 위해 사용.
예: 디렉토리 내 모든 파일 출력. - nftw:
대규모 파일 시스템 작업이나 고급 탐색 작업에 적합.
예: 심볼릭 링크를 무시한 디렉토리 크기 계산, 특정 조건에 따른 탐색.
요약 비교표
특징 | ftw | nftw |
---|---|---|
심볼릭 링크 처리 | 자동으로 따라감 | 옵션으로 따라가지 않을 수 있음 |
탐색 순서 | 전위 탐색만 지원 | 전위 및 후위 탐색 지원 |
추가 정보 제공 | 없음 | 디렉토리 깊이 등 제공 |
동작 제어 플래그 | 없음 | 플래그로 세밀한 제어 가능 |
적합한 작업 유형 | 간단한 탐색 작업 | 복잡하고 대규모 작업 |
결론
ftw
는 단순하고 빠른 구현이 필요한 경우 적합하며, nftw
는 확장성과 유연성이 요구되는 작업에서 탁월한 성능을 발휘합니다. 작업의 복잡성과 필요에 따라 적절한 함수를 선택하는 것이 중요합니다.
코드 예제: ftw 함수로 파일 탐색하기
ftw
함수는 간단한 파일 시스템 탐색 작업에 적합합니다. 아래 예제에서는 디렉토리 트리를 탐색하며 각 파일과 디렉토리의 경로와 유형을 출력하는 방법을 보여줍니다.
예제 코드
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
// 콜백 함수 정의
int print_file_info(const char *fpath, const struct stat *sb, int typeflag) {
// 파일 유형에 따라 설명 출력
switch (typeflag) {
case FTW_F: // 일반 파일
printf("File: %s\n", fpath);
break;
case FTW_D: // 디렉토리
printf("Directory: %s\n", fpath);
break;
case FTW_DNR: // 읽을 수 없는 디렉토리
printf("Unreadable Directory: %s\n", fpath);
break;
case FTW_SL: // 심볼릭 링크
printf("Symbolic Link: %s\n", fpath);
break;
default:
printf("Other: %s\n", fpath);
break;
}
return 0; // 탐색 계속
}
int main() {
const char *start_dir = "./test_dir"; // 탐색 시작 디렉토리
// ftw 호출
if (ftw(start_dir, print_file_info, 10) == -1) {
perror("ftw"); // 오류 처리
exit(EXIT_FAILURE);
}
return 0;
}
코드 설명
- 콜백 함수
print_file_info
는ftw
가 탐색한 각 파일과 디렉토리에 대해 호출됩니다.typeflag
를 사용하여 파일 유형(예: 일반 파일, 디렉토리, 심볼릭 링크 등)을 확인합니다.
- ftw 호출
start_dir
에서 탐색을 시작합니다.- 동시에 열릴 수 있는 최대 파일 디스크립터 수를
10
으로 설정합니다.
- 오류 처리
ftw
가 실패하면-1
을 반환하며,perror
를 사용해 오류 원인을 출력합니다.
출력 예시
테스트 디렉토리(./test_dir
)의 구조가 다음과 같을 때:
test_dir/
├── file1.txt
├── file2.txt
├── dir1/
│ └── file3.txt
└── symlink -> file1.txt
프로그램 실행 결과:
File: ./test_dir/file1.txt
File: ./test_dir/file2.txt
Directory: ./test_dir/dir1
File: ./test_dir/dir1/file3.txt
Symbolic Link: ./test_dir/symlink
주요 포인트
ftw
는 탐색 중 각 항목에 대해 콜백 함수를 호출하므로, 필요한 작업(예: 파일 필터링, 정보 출력 등)을 간단히 추가할 수 있습니다.- 코드가 간결하며, 디렉토리 트리를 탐색하고 작업을 수행하는 데 적합합니다.
- 단점:
ftw
는 심볼릭 링크를 무조건 따라가며, 플래그를 통한 세밀한 제어는 지원하지 않습니다.
ftw
는 간단한 디렉토리 탐색과 파일 처리를 수행할 때 유용하지만, 복잡한 작업에서는 nftw
를 사용하는 것이 더 적합합니다.
코드 예제: nftw 함수로 파일 탐색하기
nftw
함수는 ftw
의 확장된 버전으로, 심볼릭 링크 처리, 탐색 순서 제어, 추가 정보 제공 등 고급 기능을 제공합니다. 아래 예제는 디렉토리 트리를 탐색하며 각 파일과 디렉토리의 경로, 파일 유형, 디렉토리 깊이를 출력하는 방법을 보여줍니다.
예제 코드
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
// 콜백 함수 정의
int print_file_info(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
// 파일 유형에 따라 설명 출력
switch (typeflag) {
case FTW_F: // 일반 파일
printf("File: %s (Depth: %d)\n", fpath, ftwbuf->level);
break;
case FTW_D: // 디렉토리
printf("Directory: %s (Depth: %d)\n", fpath, ftwbuf->level);
break;
case FTW_DNR: // 읽을 수 없는 디렉토리
printf("Unreadable Directory: %s\n", fpath);
break;
case FTW_SL: // 심볼릭 링크
printf("Symbolic Link: %s (Depth: %d)\n", fpath, ftwbuf->level);
break;
default:
printf("Other: %s (Depth: %d)\n", fpath, ftwbuf->level);
break;
}
return 0; // 탐색 계속
}
int main() {
const char *start_dir = "./test_dir"; // 탐색 시작 디렉토리
// nftw 호출
if (nftw(start_dir, print_file_info, 10, FTW_PHYS | FTW_DEPTH) == -1) {
perror("nftw"); // 오류 처리
exit(EXIT_FAILURE);
}
return 0;
}
코드 설명
- 콜백 함수
print_file_info
는nftw
가 탐색한 각 파일 및 디렉토리에 대해 호출됩니다.typeflag
를 통해 파일 유형(일반 파일, 디렉토리, 심볼릭 링크 등)을 확인하며,ftwbuf->level
을 사용해 디렉토리 깊이를 출력합니다.
- nftw 호출
start_dir
에서 탐색을 시작합니다.- 파일 디스크립터 제한(
10
)과 플래그(FTW_PHYS | FTW_DEPTH
)를 설정합니다. FTW_PHYS
: 심볼릭 링크를 따라가지 않음.FTW_DEPTH
: 하위 항목부터 처리(후위 탐색).
- 오류 처리
nftw
호출 실패 시-1
을 반환하며, 오류 메시지를 출력합니다.
출력 예시
테스트 디렉토리(./test_dir
)의 구조가 다음과 같을 때:
test_dir/
├── file1.txt
├── file2.txt
├── dir1/
│ └── file3.txt
└── symlink -> file1.txt
프로그램 실행 결과(후위 탐색):
File: ./test_dir/dir1/file3.txt (Depth: 2)
Directory: ./test_dir/dir1 (Depth: 1)
File: ./test_dir/file1.txt (Depth: 1)
File: ./test_dir/file2.txt (Depth: 1)
Symbolic Link: ./test_dir/symlink (Depth: 1)
Directory: ./test_dir (Depth: 0)
nftw의 강력한 기능
- 심볼릭 링크 제어: 심볼릭 링크를 따라가지 않거나 특정 조건에서만 처리 가능.
- 후위 탐색: 하위 디렉토리 및 파일을 먼저 처리한 후 상위 디렉토리를 처리.
- 추가 정보 제공:
ftwbuf
를 통해 디렉토리 깊이와 파일 이름 위치 등 세부 정보를 제공. - 동작 제어: 플래그를 통해 탐색을 유연하게 조정 가능.
활용 포인트
nftw
는 대규모 디렉토리 트리에서 파일 필터링, 디렉토리 크기 계산, 특정 유형의 파일만 처리 등 복잡한 작업을 수행할 때 매우 유용합니다.
트러블슈팅: ftw와 nftw 사용 중 흔한 오류와 해결법
ftw
와 nftw
를 사용하는 동안, 다양한 이유로 오류가 발생할 수 있습니다. 여기에서는 이러한 함수 사용 중 자주 발생하는 문제와 해결 방법을 정리합니다.
1. 파일 디스크립터 부족
- 문제 원인:
ftw
와nftw
는 탐색 중에 동시에 여러 파일 디스크립터를 열어야 합니다.nopenfd
값이 너무 작거나 시스템 제한이 낮은 경우 오류가 발생할 수 있습니다. - 오류 메시지:
Too many open files
- 해결 방법:
nopenfd
값을 증가시켜 탐색 중 동시에 열리는 파일 디스크립터 수를 늘립니다.- 시스템의
ulimit
값을 확인하고, 필요한 경우 값을 증가시킵니다:bash ulimit -n 1024
2. 읽기 권한 부족
- 문제 원인:
탐색 중 권한이 없는 디렉토리나 파일에 접근하면 오류가 발생합니다. - 오류 메시지:
Permission denied
- 해결 방법:
- 프로그램이 실행되는 사용자 계정에 필요한 파일 및 디렉토리 접근 권한을 부여합니다.
- 읽기 권한이 없는 항목을 무시하려면 콜백 함수에서 조건을 추가해 오류를 회피합니다:
c if (access(fpath, R_OK) != 0) { printf("Skipped: %s (No read access)\n", fpath); return 0; // Continue traversal }
3. 심볼릭 링크 순환
- 문제 원인:
디렉토리 트리 내 심볼릭 링크가 순환 구조를 이루는 경우,ftw
또는nftw
가 무한 루프에 빠질 수 있습니다. - 해결 방법:
nftw
를 사용할 때FTW_PHYS
플래그를 설정하여 심볼릭 링크를 따라가지 않도록 합니다.- 순환 링크를 탐지하고 무시하도록 로직을 추가합니다.
4. 콜백 함수의 반환 값
- 문제 원인:
콜백 함수에서 잘못된 반환 값을 사용하면 탐색이 중단되거나 예상치 못한 동작이 발생할 수 있습니다. - 해결 방법:
- 반환 값이 정확히 정의된 의미를 따르도록 합니다.
0
: 계속 탐색.non-zero
: 탐색 중단.
- 잘못된 조건에서 반환값이 설정되지 않도록 로직을 검토합니다.
5. 대규모 디렉토리에서 성능 문제
- 문제 원인:
수십만 개의 파일이 있는 디렉토리를 탐색할 때 성능 저하가 발생할 수 있습니다. - 해결 방법:
- 콜백 함수에서 불필요한 작업(예: 과도한 출력)을 줄입니다.
- 병렬 처리를 고려하거나 작업을 여러 프로세스에 분배합니다.
6. 파일 시스템 경계 문제
- 문제 원인:
탐색이 다른 파일 시스템(예: 네트워크 파일 시스템)으로 넘어가면서 원치 않는 작업이 수행될 수 있습니다. - 해결 방법:
nftw
를 사용할 때FTW_MOUNT
플래그를 설정하여 동일 파일 시스템 내에서만 탐색하도록 제한합니다.
7. 콜백 함수에서의 메모리 문제
- 문제 원인:
콜백 함수에서 동적 메모리를 할당한 후 해제하지 않으면 메모리 누수가 발생할 수 있습니다. - 해결 방법:
- 동적 메모리를 할당한 경우 탐색 완료 전에 반드시 해제합니다.
- 필요하지 않은 경우 동적 메모리를 피합니다.
결론
ftw
와 nftw
를 사용할 때 발생할 수 있는 문제는 대부분 적절한 설정과 코딩 습관으로 예방할 수 있습니다. 특히, 플래그 설정, 파일 권한 확인, 심볼릭 링크 처리와 같은 세부적인 사항에 주의하여 안정적이고 효율적인 파일 시스템 탐색을 구현하는 것이 중요합니다.
파일 시스템 탐색 함수의 응용 사례
ftw
와 nftw
함수는 POSIX 환경에서 디렉토리 트리를 탐색하며 다양한 작업에 활용될 수 있습니다. 여기서는 파일 관리, 데이터 분석, 시스템 모니터링 등 주요 응용 사례를 살펴봅니다.
1. 파일 관리 도구
- 백업 및 동기화
디렉토리 트리를 탐색하며 파일을 복사하거나 다른 저장소에 동기화하는 백업 도구를 구현할 수 있습니다. - 예:
nftw
를 사용해 심볼릭 링크를 무시하며 디렉토리 트리를 복사. - 후위 탐색(
FTW_DEPTH
)을 활용하여 하위 디렉토리를 먼저 백업. - 중복 파일 검색
탐색 중 각 파일의 해시를 계산하고 비교하여 중복 파일을 식별할 수 있습니다. - 파일 크기와 해시를 기준으로 비교.
- 중복된 파일 목록을 생성하고 사용자가 삭제를 선택하도록 구현.
2. 데이터 분석 및 보고
- 디렉토리 크기 계산
디렉토리 내 모든 파일 크기를 합산하여 디렉토리의 총 크기를 계산합니다. - 심볼릭 링크를 무시하려면
FTW_PHYS
플래그를 설정. - 재귀적으로 디렉토리를 탐색하여 크기를 집계.
- 파일 통계 생성
파일 유형별 수, 크기, 생성 날짜 등의 통계를 생성합니다. - 예:
.txt
파일 개수와 총 크기, 최근 수정된 파일 목록.
3. 시스템 모니터링 및 유지보수
- 임시 파일 정리
특정 파일 확장자(예:.tmp
,.log
)를 가진 파일을 탐색하고 삭제하여 디스크 공간을 확보합니다. - 파일 수정 시간을 기준으로 오래된 파일만 삭제.
- 파일 권한 검사
탐색 중 각 파일의 권한을 확인하여 비정상적인 설정을 감지합니다. - 예: 실행 권한이 없어야 할 파일에 잘못된 권한이 부여된 경우 수정.
4. 특정 조건에 따른 파일 필터링
- 대용량 파일 탐색
탐색 중 특정 크기 이상의 파일을 필터링하여 별도로 기록합니다. - 예: 1GB 이상 파일의 경로를 출력하여 검토.
- 특정 확장자 파일 탐색
.c
,.h
파일과 같이 특정 확장자를 가진 파일을 탐색하고 목록화합니다. - 코드베이스 분석 도구나 프로젝트 유지보수에 활용.
5. 사용자 정의 작업 자동화
- 코드베이스 분석 및 리팩터링
C/C++ 프로젝트에서 특정 패턴(예: 함수 선언)을 가진 파일을 탐색하고 수정합니다. - 탐색한 파일에 대해 정규 표현식 검색 및 변경.
- 외부 라이브러리 확인
탐색 중 심볼릭 링크와 외부 라이브러리를 점검하여 프로젝트 종속성을 분석합니다.
6. 보안 및 감사
- 비인가 파일 탐색
디렉토리 트리를 탐색하며 특정 위치에 있어서는 안 되는 파일을 식별합니다. - 예: 공개 디렉토리에서 민감한 파일 검색.
- 심볼릭 링크 검증
심볼릭 링크가 유효한지 검사하고 깨진 링크를 보고합니다. FTW_PHYS
플래그를 설정하여 링크를 처리하지 않으면서 상태 확인.
응용 사례 코드 예시: 특정 확장자 파일 목록화
#include <ftw.h>
#include <stdio.h>
#include <string.h>
int find_txt_files(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
if (typeflag == FTW_F && strstr(fpath, ".txt") != NULL) {
printf("Text file found: %s\n", fpath);
}
return 0;
}
int main() {
const char *start_dir = "./test_dir";
if (nftw(start_dir, find_txt_files, 10, FTW_PHYS) == -1) {
perror("nftw");
return 1;
}
return 0;
}
결론
ftw
와 nftw
는 POSIX 환경에서 파일 시스템 작업을 효율적으로 처리할 수 있는 강력한 도구입니다. 다양한 응용 사례에서 유연하게 활용하여 파일 관리, 시스템 유지보수, 데이터 분석 작업을 자동화하고 최적화할 수 있습니다.