임의의 수의 파일이 필요한 프로그램이 있습니다. 그것은 다음과 같이 작동합니다
./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
관련된: