xargs에는 여러 명령과 max-args가 있습니다.

xargs에는 여러 명령과 max-args가 있습니다.

임의의 수의 파일이 필요한 프로그램이 있습니다. 그것은 다음과 같이 작동합니다

./code output.txt file1 file2 file3

수천 개의 입력 파일(file1, file2, ..., file1000)이 있습니다.

하지만

입력 파일을 여러 컬렉션으로 분할할 수 있습니다. 예를 들어, 2개의 후속 입력 파일을 결합합니다.

./code output.txt file1 file2
./code output.txt file3 file4
...

(코드를 호출할 때마다 output.txt가 추가됩니다.) 또는 후속 입력 파일 3개를 결합합니다.

./code output.txt file1 file2 file3
./code output.txt file4 file5 file6
...

도움이 될 만한 내용을 찾았습니다 xargs.

ls file* | xargs -n3

입력은 실제로 세 개의 파일 그룹으로 나뉩니다.

그러나 "I" 옵션과 함께 xargs 명령을 사용하면 파일 1만 ./code로 전달됩니다.

ls file* | xargs -n3 -I {} sh -c './code output.txt {}; command2; command3'

내가 뭘 잘못하고 있는지 지적해 주실 수 있나요?

답변1

스크립트 텍스트 {}의 일부로 사용하지 마십시오 sh -c(이 문제는 허용되는 답변에 설명된 문제와 유사합니다)"find -exec sh -c"를 사용해도 안전합니까?).

대신에:

printf '%s\n' file* | xargs -n 3 sh -c './code output.txt "$@"; command2; command3' sh

파일 이름에 개행 문자가 포함되어 있지 않으면 작동합니다. xargs비표준 -0옵션(가장 일반적인 구현)이 있는 경우 다음은 줄 바꿈이 있는 파일 이름에도 작동합니다.

printf '%s\0' file* | xargs -0 -n 3 sh -c './code output.txt "$@"; command2; command3' sh

(인용문 "$@"중요한)은 스크립트 내의 위치 매개변수 목록으로 확장됩니다 sh -c. 이는 스크립트에 지정된 파일 이름입니다 xargs. sh쓸모 없어 보이는 마지막 내용은 스크립트에 삽입되어 $0해당 sh -c셸( 의 일부가 아님 "$@")에서 생성된 오류 메시지에 사용됩니다.

zsh셸 에서 (예: bash또는 에서는 아님 sh) 다음을 수행할 수 있습니다.

for name1 name2 name3 in file*; do
    ./code output.txt $name1 $name2 $name3
    command2
    command3
done

관련된:

관련 정보