我有 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
从未有机会替换最后一个{}
.
另外,虽然您确实尝试用空值分隔文件名以“正确”处理文件名,但一旦您使用echo
. echo
inzsh
默认解释 C 风格的转义符(\t、\n 等)。您需要 -E 选项来禁用它。
尝试一下,看看它是否符合您的要求
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 并将 \> 替换为 >