我使用post-receive git hook部署我的网站。在该钩子中,我使用YUI压缩器来缩小js和css文件:
export TEMP=/var/www/example.com
GIT_WORK_TREE=/var/www/example.com git checkout master -f
#Minify mit YUI
(cd $TEMP/css && min style.css && rm style.css && mv style.min.css style.css)
(cd $TEMP/addons/css && min bootstrap.css && rm bootstrap.css && mv bootstrap.min.css
(cd $TEMP/js && min script.js && rm script.js && mv script.min.js script.js)
(cd $TEMP/addons/js && min startup.js && rm startup.js && mv startup.min.js startup.js)
现在我想不指定确切的文件,而是通过$ TEMP中的所有文件夹搜索所有js和css文件,并且每次都重复minify过程。
对于这种情况,任何人都可以帮助我使用正确的循环和搜索语法吗? 谢谢!
答案 0 :(得分:3)
这里只是一个猜测,但是这样的构造呢?
find $TEMP -name \*.css -exec sh -c 'f="{}"; min "$f" && mv "${f%.css}.min.css" "$f"' \;
我们的想法是find
命令找到所有CSS文件,然后执行min
和mv
命令。无需rm
,因为mv
会覆盖。
您可以找出JavaScript文件的等效行。 : - )
请注意,我没有对此进行测试,因为我不使用min
,但这不是关于缩小或YUI的问题,这是关于如何在多个文件中执行命令的问题目录树。
<强>更新强>
您可以通过在find
条件中添加额外的逻辑来跳过某些文件:
find $TEMP -name \*.js -and -not -name \*.min.js -exec ...
答案 1 :(得分:-1)
在使用bash终端的单个命令行中:
TEMP="/var/www/example.com"; pwd="$PWD"; IFS=$'\n'; for f in `find $TEMP -name "*.js" -or -name "*.css"`; do dir=`dirname $f`; cd "$dir"; min "$f"; ext="${f##*.}"; f2=`echo $f | sed "s/$ext$/min\.$ext/g"`; rm -f "$f"; mv "$f2" "$f"; done; cd "$pwd"
或者如果你把它放在sh文件中,那么:
#!/bin/bash
TEMP="$1";
IFS=$'\n';
for f in `find $TEMP -name "*.js" -or -name "*.css"`; do
dir=`dirname $f`
cd "$dir"
min "$f"
ext="${f##*.}"
f2=`echo $f | sed "s/$ext$/min\.$ext/g"`
rm -f "$f"
mv "$f2" "$f"
done
并以路径作为参数调用脚本或直接将其硬编码到文件中。
上述算法负责js和css文件。它移动到文件所在的目录中,并在原始命令所在的目录中创建临时文件。即使文件或目录名中有空格,或者文件名称中包含子字符串.js或.css,也不仅仅是扩展名,它也应该有效。