博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

嘎 嘎。。。

幻想具有强大的力量、俯视宇宙的智慧、没有边界的网络技术
  mmx384.cublog.cn

关于作者
姓名:乘风
性别:男
年龄:一九八二
种族:人
身高:165cm
爱好:古典文化、计算机 
愿望:实现理想的自我
性格:懦弱、好胜
Email:mmx384@gmail.com

本人爱好古典文化,对禅宗、红楼梦、易经、围棋等有所涉猎,但知识浅溥,深以为憾。
|| << >> ||
我的分类


我的习惯性SHELL小脚本
这也许称不上SHELL脚本,因为它实在太短了,但这些小脚本却使我的日常操作方便而简单。

command-line模式仅仅在写C程序的时候会用,其它大部分时间还是用GUI,我没有安装gnome或kde,文件管理器是rox,刚开始我很不喜欢它,但现在已经习惯了。

在rox中建立文件关联可以选中这个文件,在右键Set Run Action...中设置关联某个命令打开,但是对于*.tar.bz2 *.tar.gz *.rar *.zip这一类的文件,我常常想把它解压到/tmp目录中,我写几个这样的小脚本

对于×.rar文件用:(*.zip文件也可以下面的脚本,仅仅将unrar x "$@"改为unzip "$@")

#!/bin/sh

TEMP=`basename "$@"`
DIR=${TEMP%.*}
if [ -d "/tmp/$DIR" ]; then
    cd "/tmp/$DIR"
    unrar x "$@"
else
    mkdir "/tmp/$DIR"
    cd "/tmp/$DIR"
    unrar x "$@"
fi    


对于*.tar.bz2, *.tar.gz则更简单

#!/bin/sh

tar -xf "$@" -C /tmp


*.rpm文件则这样

cd /tmp && \
rpm2cpio "$@" | cpio -dvi


用xmms播放一个目录下的所有文件(将此脚本放在~/.config/rox.sourceforge.net/SendTo/.inode_directory目录下)

#!/bin/sh

exec xmms "$@"


网上下载一个压缩文件,通常解压后其文件名编码可能是cp936,可以将其转换为utf8编码的文件名

#!/bin/sh

find "$@" -type d | while read DIR
do
    convmv -f euc-cn -t utf8 --notest "$DIR"
done

find "$@" -type f | while read FILE
do
    convmv -f euc-cn -t utf8 --notest "$FILE"
done


在Linux下MPlayer的字幕文件*.srt须用utf8编码,但网上字幕文件几乎是cp936编码,可以将其转换(将其简单修改一下,可以将cp936编码的文本文件转换为utf8编码的文本文件)

#!/bin/sh

srt="${@##*.}"
[[ "$srt" == "srt" ]] && iconv -f euc-cn -t utf8 "$@" -o "${@%.*}.utf8"


这是我的.alias.list文件

alias ll='ls --color -l | less'
alias lsd='ls -d */'
alias play='find ~/music -type f -name "*.mp3" -o -name "*.wma" > /tmp/music.list && mplayer -shuffle -playlist /tmp/music.list'
alias bye='/sbin/halt -p'
alias psu='ps -fu $(id -un)'
alias reboot='/sbin/reboot'


用下面的脚本调用mplayer秋sp-sc观看一些在线频道(在命令执行:mp [端口],端口请到http://www.sopcast.com/查看)

#!/bin/bash

case "$1" in
    star | starmovie)
        address="sop://220.112.88.18:3912/30020"
        ;;
    *)
        address="sop://broker.sopcast.com:3912/$1"
        ;;
esac

[ -n "$address" ] && {
    sp-sc "$address" 3908 8900 > /dev/null &
    [[ $? == "0" ]] && {
        printf "Wait for five seconds......"
        sleep 5
    }
} && {
    mplayer http://localhost:8900/tv.asf && pkill sp-sc
}


我安装程序通常将其安装在/home/local目录下,每个程序安装在一个单独的目录,我虽然知道这样做不太符合Linux的传统,但是它更方便于删除一个已安装的程序(说一句不怕别人笑话的话,从源码安装的应用程序我还不知道怎么删除)。但这样做同样带来一个问题,启动程序时要输入完整的路径,如/home/local/acrobat-5.0.5/bin/acroread,也许你会想用 ln -s /home/local/acrobat-5.0.5/bin/acroread ~/bin/acroread,但这样的链接并不是对所有的程序都是有效的,为了解决问题于是就有了下面的脚本:


#!/bin/sh

declare -r APPLET_PATH="/home/local"
APPLET=""

findapplet(){
    if [ -n $1 ]; then
        APPLET="`find $APPLET_PATH -maxdepth 1 -type d \
         -name "
${1}*"`"
    fi
}


[ -n "$1" ] && {

case "$1" in
    acro | acroread)
        findapplet "acrobat"
        shift
        $APPLET/bin/acroread "$@" &
        ;;
    bt | azureus)
        findapplet "azureus"
        $APPLET/azureus &
        ;;
    ff | firefox)
        findapplet "firefox"
        shift
        $APPLET/firefox "$@" &
        ;;
    ftp | gftp)
        findapplet "gftp"
        $APPLET/bin/gftp-gtk &
        ;;
    gq | gqview)
        findapplet "gqview"
        shift
        $APPLET/bin/gqview "$@" &
        ;;
    ml | mlnet)
        if (pgrep mlnet >/dev/null); then
            pkill mlnet
        else
            $HOME/bin/mlnet &
        fi
        ;;
    music | play | playmusic)
        if (pgrep mplayer); then
            pkill mplayer
        else
            pls="/tmp/music.list"
            [ -f "$pls" ] || {
                find ~/music -type f -name "*.mp3" \
                -o -name "*.wma" > $pls
            }
            mplayer -shuffle -playlist $pls >/dev/null 2>&1
        fi
        ;;
    xmms)
        if (pgrep xmms); then
            pkill xmms
        else
            xmms ~mmx/music/music_new 2>&1
        fi
        ;;

    rox)
        findapplet "rox"
        shift
        $APPLET/bin/rox "$@" &
        ;;
    real | realplay)
        findapplet "realplay"
        shift
        $APPLET/realplay "$@" &
        ;;
    skp | skype)
        findapplet "skype"
        $APPLET/skype &
        ;;
    star | dict | stardict)
        findapplet "stardict"
        $APPLET/bin/stardict 1>/dev/null &
        ;;
    oo | sw | sc | swriter | scalc | soffice)
        findapplet "openoffice.org.cn"
        shift
        $APPLET/program/soffice "$@" &
        ;;
    urxvt | rxvt)
        findapplet "rxvt"
        $APPLET/bin/urxvt &
        ;;
    xpdf)
        findapplet "xpdf"
        shift
        $APPLET/bin/xpdf "$@" &
        ;;
    gimp)
        shift
        gimp-remote -n "$@" &
        ;;
    #games

    sok | sokoban)
        findapplet "syasok"
        cd $APPLET
        ./syasokoban &
        ;;
    llk)
        findapplet "llk"
        $APPLET/bin/llk_linux &
        ;;
    tux | supertux)
        findapplet "supertux"
        $APPLET/bin/supertux
        ;;
    pkill | jobskill)
        shift
        jobskill "$@"
        ;;
    *)
        echo -ne "\`$1': no command or directory.\n"
esac

}


这样只要在终端中执行rc xxx 就能启动一个程序,同样的有些程序支持中文局面,可以用下面的脚本这样启动rcc xxx

#!/bin/bash

Usage(){
    echo -ne "Usage: ${0##*/} command.\n"
}

if [ -z "$1" ]; then
    Usage
    exit 0
else
    export LC_ALL=zh_CN.utf8
fi

. $HOME/bin/rc


这是我用来编译*.tex文件的cjk脚本

#!/bin/sh

ARGLENGTH=4
DVIPDFM="dvipdfm"
BROWSER_PDF="acroread"
BROWSER_DVI="xdvi"

# print the help infomation.
usage()
{
    echo -e "Usage: ${0##*/} [option] file [file] [file] "
    echo -e "option:"
    echo -e "\t -h,--help\t print this help."
    echo -e "\t -a,--all\t compile \"tex\" to \"dvi\" to \"pdf\"."
    echo -e "\t -c,--create\t create \"pdf\" file from \"tex\" or \"dvi\"."
    echo -e "\t -v,--view\t view \"dvi\" or \"pdf\" file."
}


if [ $# -gt $ARGLENGTH ]; then

    echo -e "arguments too much."
    exit 1
elif [ $# = 0 ]; then

    usage
    exit 1
else     case $1 in
        -c | --create | -v | --view | -a | --all | -h | --help )
            OPTION="$1"
            shift
            ;;
    esac
fi


for filename in "$@";
do
    EXP="${filename##*.}"
    filebase="${filename##*/}"

    if [ -z "$OPTION" ] && [ $EXP = "tex" ]; then
        latex "${filename}"
    elif [ -f "$filename" ]; then
        case $OPTION in
            "-h" | "--help" )
                usage
                exit 0
                ;;
            "-v" | "--view")
                case $EXP in
                "pdf")     $BROWSER_PDF "${@}" 2> /dev/null &
                    exit 0
                    ;;
                "dvi")     $BROWSER_DVI "${filename}" 2> /dev/null &
                    ;;
                esac
                ;;
            "-c" | "--create")
                case $EXP in
                "dvi") $DVIPDFM "${filebase}"
                    exit 0
                    ;;
                "tex")     latex "${filename}"
                    $DVIPDFM "${filebase%.*}.dvi"
                    ;;
                esac
                ;;
            "-a" | "--all")    
                latex "${filename}"
                if [ -f "${filebase%.*}.dvi" ]; then
                    $BROWSER_DVI "${filename%.*}.dvi" 2> /dev/null &
                    $DVIPDFM "${filebase%.*}.dvi"
                fi
                ;;
        esac
    else echo "$filebase: doesn't exist."
    fi
        
done


# unset value and function
unset ARGLENGTH DVIPDFM BROWSER_PDF BROWSER_DVI OPTION filename filebase EXP
unset -f usage


这是我去年寒假回家之前用来打包CU的shell版块的脚本,在不能上网的时候翻翻帖子

#!/bin/bash

# 本脚本用wget从 http://bbs.chinaunix.net/ 上对SHELL版块进行打包
#
# SHELL版块大概800页左右,下载的时候在命令行中指定两个数字,例如:
#
#    $ ./script 1 100
#
#会从CU SHELL版下载从最新的第1页至第100页
#没有解决的问题:
#    精华帖子没有下载
#    仅下载回复数大于n的帖子
#    仅下载指定id发表或回复过的帖子


declare -i PAGE_NUM="${1:-1}"
declare -i PAGE_MAX="${2:-1}"

WEBBASE="http://bbs.chinaunix.net/"
PAGEBASE='forumdisplay.php?fid=24&page='
PATTON="viewthread.php.tid=([0-9][0-9]*).amp.extra=page([0-9][0-9]*).amp.page=([0-9][0-9]*)"

while [ ${PAGE_NUM} -le ${PAGE_MAX} ];
do
    TEMP="forumdisplay.php?fid=24&page=${PAGE_NUM}"
    PAGEFILE="page${PAGE_NUM}.html"
    wget -q -c "${WEBBASE}${TEMP}" && {
        if [ -f "$TEMP" ]; then
            mv "$TEMP" "$PAGEFILE"
        fi
        grep -E -o 'viewthread.php.tid=[0-9][0-9]*.extra.page' "${PAGEFILE}" > /tmp/page${PAGE_NUM}.lst
        sed -i -e "s@\$@${PAGE_NUM}@g" /tmp/page${PAGE_NUM}.lst
        mkdir "$PAGE_NUM"
        cd "$PAGE_NUM"
        wget -q -c -k -i /tmp/page${PAGE_NUM}.lst
        rm /tmp/page${PAGE_NUM}.lst
    }

    # 如果帖子不止一页,下载所有的页面
    {
    find -type f | while read filename;
    do
        FILEID=$(echo "$filename" | cut -d'&' -f1 | cut -d'=' -f2)
        sed -n -e '147,150p' "$filename" | tr '>' '\n' | tr '"' '\n' | grep 'viewthread' | sort -u > /tmp/url_${FILEID}.lst
        sed -i -e "s@%3D@@g" -e "s@amp;@@g" /tmp/url_${FILEID}.lst
        wget -q -c -k -i /tmp/url_${FILEID}.lst
        
        # 对下载的网页改名
        mv "$filename" "${FILEID}_1.html"
        cat /tmp/url_${FILEID}.lst | while read subfile;
        do
            infile=`basename $subfile`
            outfile=$(echo "$subfile" | sed -n -r -e "s@.*=([0-9])@\1@gp")
            if [ -n "$outfile" ]; then
                mv "$infile" "${FILEID}_${outfile}.html"
            fi
        done
        
        # 替换page$N.html中帖子列表的绝对链接,类似:
        # viewthread.php?tid=915&extra=page%3D1&page=2
        sed -i -e "s@viewthread.php.tid.${FILEID}.extra.page.3D${PAGE_NUM}@./${PAGE_NUM}/${FILEID}_1.html@g" ../"${PAGEFILE}"
        rm /tmp/url_${FILEID}.lst
    done
    
    # 搜索下载的页面,替换绝对链接
    #viewthread.php?tid=915&extra=page%3D1&page=2
    #http://bbs.chinaunix.net/viewthread.php?tid=915&extra=page%3D1&page=2
    find -type f | while read filename;
    do
        sed -i -r -e "s@${WEBBASE}${PATTON}@./\1_\3.html@g" \
            -e "s@${PATTON}@./\1_\3.html@g" "$filename"
    done
    cd ..
    }
    
    # 替换page$N.html中的上一页,下一页的绝对链接
    # forumdisplay.php?fid=24&page=2
    sed -i -r -e 's@forumdisplay.php.fid.24.page.([0-9][0-9]*)@./page\1.html@g' ./"$PAGEFILE"

    ((++PAGE_NUM))
done

发表于: 2007-06-11,修改于: 2007-06-11 20:57,已浏览645次,有评论0条 推荐 投诉


网友评论
 发表评论