使用uglifycss修改输出文件扩展名的技术咨询
解决UglifyCSS压缩后生成双重.css后缀的问题
你遇到的问题很典型——find命令里的{}会输出完整的文件名(包括.css后缀),直接追加.min.css自然会得到xxx.css.min.css这种不符合预期的结果。下面给你两种可靠的解决方案,都是通过替换原文件的扩展名而不是追加来生成目标文件:
方案1:使用Bash参数扩展(推荐)
利用Bash的内置参数扩展语法来快速移除.css后缀,再拼接.min.css:
find dist/assets/css/ -type f -name "*.css" -exec bash -c 'uglifycss --output "${0%.css}.min.css" "$0" && rm "$0"' {} \;
关键解释:
${0%.css}:这是Bash的参数扩展语法,意思是取变量$0(也就是find传入的当前文件名),移除末尾的.css后缀。比如style.css会变成style。- 再拼接
.min.css,就得到了style.min.css,完美符合你的需求。 && rm "$0":只有当uglifycss执行成功时,才删除原文件,避免压缩失败误删源文件。
方案2:使用Sed替换扩展名
如果你更习惯用文本处理工具,也可以用sed来替换文件名的后缀:
find dist/assets/css/ -type f -name "*.css" | while read -r css_file; do min_file=$(echo "$css_file" | sed 's/\.css$/.min.css/') uglifycss --output "$min_file" "$css_file" && rm "$css_file" done
关键解释:
sed 's/\.css$/.min.css/':用正则匹配文件名末尾的.css,替换成.min.css,同样能得到正确的目标文件名。while read -r css_file:循环处理find输出的每个文件,引号包裹变量能兼容文件名含空格的场景。
这两种方案都能解决你的问题,方案1更高效(不需要额外启动sed进程),推荐优先使用。
内容的提问来源于stack exchange,提问作者Suhaib Janjua
相关产品推荐
相关产品推荐

