这也许称不上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目录下)
网上下载一个压缩文件,通常解压后其文件名编码可能是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
|