Huny's Dev Blog
huny.dev

Linux에서 Argument list too long 해결하기

Linux E2BIG의 전체 인수·환경 제한과 단일 인수 제한을 구분하고, find -exec로 파일명을 안전하게 묶어 전달한다.

Hun Jang
Hun Jang Nov 15, 2026

Linux에서 파일이 많은 디렉터리를 처리하다 Argument list too long이 나오면, 파일 목록을 한 번에 인수로 넘기는 부분부터 확인한다. 검색 조건이 맞으면 find -exec … {} +로 나눠 전달한다. 단일 인수 자체가 너무 길다면 데이터를 표준 입력이나 파일로 전달한다. 두 상황은 같은 E2BIG로 나타날 수 있다.

청록색 파일 타일이 여러 묶음으로 나뉘어 주황색 통과 지점에 접근하는 모습

명령을 실행하기 전에 실패하는 이유

셸이 *.txt를 확장하면 각 파일명이 별도 인수가 된다. 커널은 프로그램 실행 시 인수와 환경 변수의 크기에 제한을 적용한다. getconf ARG_MAX는 전체 제한의 기준을 확인하는 데 도움이 되지만, 환경 변수와 종료 널 바이트도 공간을 사용한다. Linux는 단일 문자열에도 32페이지 제한을 적용하며 이 크기에는 종료 널 바이트가 포함된다. 따라서 전체 제한만으로 단일 인수의 허용 길이를 판단할 수 없다. Linux execve(2)

파일명은 나누어 전달하고 긴 데이터는 입력으로 읽기

현재 디렉터리의 일반 파일 중 이름이 .txt로 끝나는 파일을 처리한다고 가정한다. 하위 디렉터리까지 검색하면 범위가 달라지므로, 이 예에서는 GNU find의 -maxdepth 1을 쓴다. 패턴을 따옴표로 감싸면 셸은 펼치지 않고 find가 이름을 비교한다.

find . -maxdepth 1 -type f -name '*.txt' -exec wc -c -- {} +

find는 파일 경로를 별도 인수로 전달하고 필요한 경우 명령을 여러 번 실행한다. 공백이나 줄바꿈이 들어간 이름도 인수 하나로 유지된다. wc가 출력하는 합계는 실행한 묶음별로 계산된다. 단일 인수가 너무 긴 경우에는 묶음을 나누더라도 그 인수의 크기가 유지되므로, 대상 프로그램이 지원하는 표준 입력이나 파일 입력을 사용한다. GNU findutils 문서

E2BIG와 파일명 보존 확인하기

아래 예제를 argv_limits_demo.py로 저장하고 python3 argv_limits_demo.py를 실행한다. Linux에서 단일 인수를 32페이지 분량으로 만들어 종료 널 바이트까지 포함하면 제한을 넘는지 확인한다. 이어 임시 디렉터리에 세 파일을 만들고, 전달된 인수를 널 바이트로 구분해 비교한다.

2026년 11월 15일 Linux x86-64에서 Python 3.12.14와 GNU findutils 4.10.0으로 실행했다.

이 실험은 단일 인수 제한과 파일명 전달을 검증했다. 파일 세 개만 사용했으므로 실제로 여러 묶음을 만드는 임계점은 측정하지 않았다. 작업에 전체 결과를 한 번에 처리해야 하는 제약이 있다면 묶음별 실행이 결과를 바꿀 수 있으므로, 호출 대상이 파일 목록 입력이나 스트리밍을 지원하는지 확인한다.

English version · Fix Argument List Too Long on Linux with find -execFix Argument List Too Long on Linux with find -exec

추천 글