약 8000개 파일 처리 시 "find: fts_read: Invalid 인수" 발생

약 8000개 파일 처리 시 "find: fts_read: Invalid 인수" 발생

GNU bash 버전 3.2.48에는 이 버그가 있습니다. 버전 3.2.57은 더 이상 사용할 수 없습니다.

8000개의 동일한 라인을 포함하는 파일을 만듭니다(각 라인이 기록된다고 가정 1). split -a3 -p "1"run on it ( 주어진 패턴에 따라 분할되도록 하는 -pBSD 옵션입니다 . 한 줄에 한 줄만 있는 파일의 경우 실행하여 표준과 동일한 작업을 수행할 수 있습니다.) 그리고 실행split1splitsplit -a3 -b 1

find . -name xaaa -exec echo {} +

예상된 출력 후에 find: fts_read: Invalid argument는 로 출력 됩니다. cerr파일 세트와 시도한 다른 명령으로 xaaa대체하면 동일한 오류가 발생합니다 . echo파일 이름의 길이는 중요하지 않습니다. 파일의 디렉토리도 중요하지 않습니다.

다른 곳에서 일부 파일을 생성한 후 오류가 사라졌습니다. 그러나 여러 파일을 포함하는 다른 와일드카드(또는 적어도 하나가 디렉터리 목록의 시작 부분에 있음) xaaa로 바꾸면 오류가 다시 발생합니다. xaa*현재로서는 오류를 일으키는 단일 파일이 없습니다.

+다음 으로 바꾸면 ;오류가 방지되지만 내 스크립트에서는 허용되지 않습니다. 이 문제는 내 스크립트의 다른 경우에 간헐적으로 발생했지만 문제를 줄임으로써 이를 복제하는 간단한 방법을 알아낼 수 있었습니다.

오류가 발생하면 스크립트를 중지하고 싶지만 이렇게 하면 스크립트가 자주 중지됩니다. 이 문제를 해결하는 방법을 아시나요? (예를 들어 오류 코드를 검색하고 이 특정 오류를 무시합니다.)

맥 OS 버전 10.8.5. 다윈 커널 버전 12.5.0.

답변1

bash가 관련될 가능성은 거의 없습니다.

Bash의 역할은 이 코드를 구문 분석하고 , , , , , 를 사용하여 find . -name xaaa -exec echo {} +실행 으로 변환하는 것입니다. 모든 bash 버전은 동일한 작업을 수행합니다./path/to/findfind.-namexaaa-exececho{}+

여기에서 find:오류 메시지의 접두사로 오류는 에 의한 find것이 아니라 에 의한 것입니다 bash. 특히 함수에서 반환된 오류에 관한 것입니다 fts_read().

macos find는 FreeBSD 버전으로, Apple에서 수정했을 수 있습니다.

고맙게도 FreeBSD(Macos가 아니라면)는 FLOSS이고 상대적으로 찾기 쉽습니다.오류가 코드에 출력됩니다..

/*
 * find_execute --
 *  take a search plan and an array of search paths and executes the plan
 *  over all FTSENT's returned for the given search paths.
 */
int
find_execute(PLAN *plan, char *paths[])
[...]
    e = errno;
    finish_execplus();
    if (e && (!ignore_readdir_race || e != ENOENT))
        errc(1, e, "fts_read");
    return (exitstatus);
}

함수가 끝나면 find_execute.

여기서 우리는 다음을 얻습니다:

 find: fts_read: Invalid argument

Invalid argumenterrno 에 해당하는 오류 메시지입니다 EINVAL.

여기서 호출이 이루어지기 전 루프의 조건문에서 as가 0 errno으로 설정되어 있으며 fts_read루프를 종료하므로 this 수단만 반환됩니다.errnowhilefts_readfts_readNULL

당신이 보면매뉴얼 페이지fts_read, 당신은 발견 할 것이다:

함수 fts_read()fts_children()는 실패할 수 있으며 errno 라이브러리 함수, 및 에서 지정한 오류를 설정할 수 있습니다.chdir(2)malloc(3)opendir(3)readdir(3)stat(2)

이러한 링크를 따라 다른 매뉴얼 페이지로 이동하면 그 중 어느 것도 EINVAL을 반환하지 않습니다.

find따라서 Apple 이나 fts라이브러리 의 버그와 매우 유사해 보입니다 . 코드에 접근할 수 없으면 우리가 할 수 있는 일이 많지 않을 수 있으므로 이 문제를 Apple 지원에 제기하는 것이 좋습니다.

관련 정보