[ Content | Sidebar ]

Posts tagged shell

纯sed压缩css文件

额,如果不考虑用java,还是可以考虑考虑这个…

#!/bin/sh
#"^M"用来代替显示win下的换行符,直接复制这段脚本是不能用滴
cat $1 | sed -e 's/^M//g;s/^\xef\xbb\xbf//g;s/\([^0-9]\)0p[xt]/\10/g' -e 's/\/\*.*\*\///g' | sed -e '/^[\t ]*\/\*/,/\*\/[\t ]*$/d' | sed -e '/^[\t ]*$/d' -e 's/^[\t ]*//g' -e 's/;[\t ]*/;/g' -e 's/}[\t ]*/}/g' -e 's/\([^,\{;\}]\)$/\1;/g' -e 's/};/}/g' | sed -e :a -e '/[,;{][\t ]*$/{N;s/\n/ /;ba}' > /tmp/lala_css
mv /tmp/lala_css $1
Copy Code 

压缩规则较简单..

  • 删除注释
  • 删除不必要的空白
  • 删除window的utf BOM标记,删除win下的换行符
  • 每条规则压成一行
  • 0px -> 0

压缩效果如下,比yuicompressor差一点:

 72344 2009-12-01 19:57 layout.css
 69626 2009-12-01 19:52 layout-mini-sed.css
 68720 2009-12-01 19:56 layout-mini-yui.css

文件下载点这里:compress-css.zip

批量替换css里图片的相对路径为绝对路径

最近好像总是发些shell的东西,木办法,最近没怎么写js的样子…
————————————————————–
恩,之所以要替换成绝对路径,是因为css和图片host在不同域的server上,写完刚在站里的静态跑过,好像木啥大问题~
效果:

/img/a.gif 会被替换成 http://domain/img/a.gif
../img/a.gif 会被替换成类似 http://domain/parent/img/a.gif

使用方法如下(linux only)

#直接跟目录就好了
sh r2a.sh /opt/static
Copy Code 

脚本下载点这里:r2a.zip
贴出shell的源码,便于不想下载又想看看shell的同学,还有个python脚本,就不贴了,没啥含量

#!/bin/sh
#@author emptyhua@gmail.com
 
#本地根目录
LROOT="/home/hualu/work/static"
#远程根目录
RROOT="http://myimgdomain.cn"
#要处理目录的绝对路径
CP="`cd $1;pwd`"
#用于转换相对路径为绝对路径的python脚本的路径
PY="/home/hualu/bin/get_sed_rule.py"
LROOTR="`echo ${LROOT} | sed 's/\\//\\\\\//g;s/\\./\\\\\\./g'`"
RROOTR="`echo ${RROOT} | sed 's/\\//\\\\\//g;s/\\./\\\\\\./g'`"
 
echo "执行路径${CP}"
find ${CP} -name "*.css" > /tmp/_r2a_css_files 
 
cat /tmp/_r2a_css_files | while read f;do
    echo "处理:${f}"
    dir="`dirname \"${f}\"`"
#获取css文件所在的发布目录
    echo "${dir}" | sed "s/${LROOTR}/${RROOTR}/" > /tmp/_r2a_remote_path
    remote_path="`cat /tmp/_r2a_remote_path`"
#收集要处理的图片路径
    cat $f | awk '{print NR,"####",$0}' | grep "url([\"\']*\.\{1,2\}" > /tmp/_r2a_file
    cat /tmp/_r2a_file | sed -e "s/url([\"\']*\(\.\.[^\)]*\)[\"\']*)/开始\1始开/g" -e "s/####[^始]*开始/:/;s/始开[^始]*$/:/;s/始开[^始]*开始/:/g" > /tmp/_r2a_cssimage
    echo '' > /tmp/_r2a_sed_rule
#将相对路径转换为绝对路径,并生成sed语句
    cat /tmp/_r2a_cssimage | while read r;do
        rule="`python \"${PY}\" \"${r}\" \"${remote_path}\"`"
        echo "${rule};" >> /tmp/_r2a_sed_rule 
    done
    sed_rule="`cat /tmp/_r2a_sed_rule | tr -d '\\n'`"
#利用sed处理文件
    sed -i -e "$sed_rule" "${f}"
    sed -i -e "s/url(\([\"\']*\)\//url(\1${RROOTR}\//g" "${f}" 
done
 
rm /tmp/_r2a_css_files
rm /tmp/_r2a_remote_path
rm /tmp/_r2a_file
rm /tmp/_r2a_cssimage
rm /tmp/_r2a_sed_rule
Copy Code 

scp 保留文件权限

http://linux.chinaunix.net/bbs/viewthread.php?tid=912911

1 打包后,再用scp传过去就可以了,因为打包是保留权限设置信息,
2 用scp 传过去后, 到正确权限的主机是,备份权限, 再备份权限,
getfacl 获取当前正常系统的文件权限,到另一台机器上用 setfacl 恢复。
getfacl -R /root/test > acl.bak
把acl.bak的文件copy过来
setfacl --restore acl.bak

/dev/null 2>&1

http://viplin.blog.51cto.com/241472/99568

用于shell中屏蔽错误信息…

恶作剧脚本..

昨晚公司开颁奖晚会(日子选的很别扭),偶们改的状态会实时显示在状态墙上.彩排完毕超市购物间隙跟强哥想到一个恶搞的方法–刷屏.具体来说就是用偶们几个人滴号不停的改状态刷状态墙.于是立刻找到一个网吧实施罪恶的行为.

我写脚本,强哥写用来刷屏的状态,额,用shell改状态就两句话,不过放在公司的机器上,没办法,还得现查curl,最终在入场之前还是把脚本写完了…

#!/bin/sh
 
#所有的状态放到status.txt中,然后用这个函数循环取
get_status()
{
    #取第一行状态
    head -1 status.txt
    #第一行移动到最后一行
    sed -i -e '1{h;d};$G' status.txt
}
 
#该状态的函数,两个参数:用户名,密码
send_status()
{
    user=$1
    pass=$2
    word="`get_status`"
    word="`perl -MURI::Escape -e "print uri_escape('${word}');"`"
    curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -D /tmp/cookies -d "email=${user}&password=${pass}" http://login.renren.com/login.do
    curl -e "http://renren.com/Home.do" -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -b /tmp/cookies -d "c=${word}&raw=${word}" http://status.renren.com/doing/update.do 
}
 
#main
send_all()
{
    while [ "s"="s" ];do
        #on_off.txt是个开关文件,如果存在时才会发状态
        if [ -e "/tmp/on_off.txt" ];then
            #用户名和密码都存在user.txt里
            #跟状态一样也是轮着来
            u_p="`head -1 user.txt`"
            sed -i -e '1{h;d};$G' user.txt
            user="`echo "${u_p}" | cut -d: -f 1`"
            password="`echo "${u_p}" | cut -d: -f 2`"
            #改状态了
            send_status $user $password
        fi
        #五秒钟发一次
        sleep 5
    done
}
 
send_all
Copy Code 

脚本写完了,但是怎么启动呢,我的手机上有个putty,但是登server太慢了,于是又写了一个开关的php

<?php
if(file_exists('/tmp/on_off.txt'))
{
    unlink('/tmp/on_off.txt');
}
else
{   
    $fp = fopen('/tmp/on_off.txt', 'w');
    fwrite($fp,'ooxx');
    fclose($fp);
}
?>
Copy Code 

这样就比较方便了,shell在server上运行,只要用手机浏览器访问这个开关的php就可以了~

后来使用中遇到点问题,手机浏览器的缓存实在太强了!!!!!!