zsh 스크립트가 있습니다
printf '%s\0' www/scripts6/lib/* | xargs -0 -I{} -P 50 babel {} > {}
효과가 있었습니다(내 생각에는). 하지만 실제로 파일을 scripts
디렉터리 에 복사해야 합니다 scripts6
. 또한 경로 목록에 추가 경로를 수동으로 추가해야 하므로 다음을 시도했습니다.
paths=$(printf '%s\0' www/scripts6/lib/* | sed -e 's@www/scripts6/@@g')
paths=$paths'main.js'$'\0'
echo -n $paths | xargs -0 -I {} -P 50 babel www/scripts6/{} > www/scripts/{}
이것은 나에게 큰 성과이다. 그럼에도 불구하고 스크립트는 디렉터리 {}
에 지정된 파일을 생성합니다 scripts
(디렉터리의 콘텐츠 없이 scripts/lib
). 이로 인해 코드의 첫 번째 항목만 인수로 대체되고 두 번째 항목은 대체되지 않는다고 믿게 됩니다 {}
(그리고 디렉토리에서 누락된 파일을 설명하지 않습니다 scripts/lib
).
스크립트가 예상대로 작동하도록 하려면 어떻게 해야 합니까?
답변1
xargs
실행 전에 리디렉션이 발생합니다 . 따라서 첫 번째 예 에서는 마지막 파일을 대체할 기회가 없기 {}
때문에 이라는 파일도 생성합니다 .xargs
{}
또한 파일 이름을 null로 구분하여 "적절하게" 처리하려고 시도하는 동안 C 스타일 이스케이프(\t, \n 등)를 사용하면 기본적으로 해석 됩니다 echo
. 비활성화하려면 -E 옵션이 필요합니다.echo
zsh
시험해보고 귀하의 요구 사항을 충족하는지 확인하십시오.
setopt monitor
for f in www/scripts6/lib/*(e*'REPLY=${REPLY#www/scripts6/}'*) main.js; do;
while (( $#jobstates >= 51 )); do
sleep 1
done
echo -E babel $f \> www/scripts/$f &
done
출력이 괜찮아 보이면 echo -E를 제거하고 \>를 >로 바꾸세요.