前几天装Dubuntu,默认/home是在装/分区,我手工将它挂在了/dev/hda10上, 当时在LiveCD下用root用户执行cp -R命令将/home下的文件复制到/dev/hda10上, 重启登入时报错,/home的权限设置不对,无法登入。 最后是用( cd /mnt/du/home; tar -cvf - . ) | ( cd /mnt/hda10; tar -xvf - )命令复制 在复制文件的同时,目录结构,修改时间,权限等也一并复制了,重启,登入成功。
这个命令比较长,而且空格较多容易输错命令 于是想减化一个输入,便想到了写一个脚本。同时以后要用到时也方便、安全些。 正好最近在学shell编程,也是一个练手的机会。 这是我写的第二个脚本,第一次写的是删除openoffice.org的脚本,格盘时不小心格了。
在使用该脚本时有两种模式可选择, 一种是命令模式,这是最早的写的。当时的脚本只有几行,只是把两个参数嵌入”cd“的后面,没有提示,没有路径与目录的检测。 另一种是向导模式,主要是给初次接触Linux的新手用的。 既然写了就要写好,于是加入了不同的使用模式,”是否为绝对路径“、”是否为目录“的检测,帮助与错误提示等。
代码:
#! /bin/bash
#脚本名称:Xcopy.sh #脚本作者:SUN_Knight #脚本功能:将源目录的目录结构、权限、修改时间等完整的复制到目标目录。 #脚本备注:写这个脚本的目的有三个 # 1.练习写脚本 # 2.以后装Dubuntu等系统时,将/home单独挂载到一个分区时方便复制 # 3.方便以后需要完整复制时可以偷懒,嘿嘿 # #最后还要感谢LinuxSir上lastart兄和stoneman兄的帮助 #lastart和stoneman两位兄弟分别提供了两种不同的"是否为绝对路径"的判断方法 #因为修改现有代码方便,最终采用了lastart兄弟的方案,再次表示感谢。
case "$#" in
#向导模式 0) echo "将要复制目录结构" echo "请输入源目录绝对路径:" read s_dir echo "请输入目标目录绝对路径:" read d_dir while [ $# -eq 0 ] do if [ "${s_dir#/}" = "${s_dir}" ] then echo "错误的输入:" echo " $s_dir不是绝对路径" if [ "${d_dir#/}" = "${d_dir}" ] then echo " $d_dir不是绝对路径" echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" break fi echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" break else if [ "${d_dir#/}" = "${d_dir}" ] then echo "错误的输入:" echo " $d_dir不是绝对路径" echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" break else if [ -d $s_dir ] then if [ -d $d_dir ] then echo "请确认:" echo "您将要把$s_dir目录完整复制到$d_dir目录中" echo "yes/no?" read yn if [ $yn = "yes" ] then ( cd $s_dir; tar -cvf - . ) | ( cd $d_dir; tar -xvf - ) break elif [ $yn = "no" ] then break else echo "您的输入:${yn}不正确" continue fi else echo "错误的输入:" echo " $d_dir不是目录" echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" break fi else echo "错误的输入:" echo " $s_dir不是目录" if [ -d $d_dir ] then echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" break else echo " $d_dir不是目录" echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" break fi fi fi fi done ;;
#命令模式 2) if [ "${s_dir#/}" = "${s_dir}" ] then echo "错误的输入:" echo " $s_dir不是绝对路径" if [ "${d_dir#/}" = "${d_dir}" ] then echo " $d_dir不是绝对路径" echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" else echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" fi else if [ "${d_dir#/}" = "${d_dir}" ] then echo "错误的输入:" echo " $d_dir不是绝对路径" echo "因为您错误的输入,程序将退出。" echo "您可以检查正确的输入后重新运行本程序。" else if [ -d $1 ] then if [ -d $2 ] then ( cd $1; tar -cvf - . ) | ( cd $2; tar -xvf - ) else echo "错误的输入:" echo " $2不是目录" echo "请您使用以下命令查看帮助:" echo "Xcopy.sh help" fi else echo "错误的输入:" echo " $1不是目录" if [ -d $2 ] then echo "请您使用以下命令查看帮助:" echo "Xcopy.sh help" else echo " $2不是目录" echo "请您使用以下命令查看帮助:" echo "Xcopy.sh help" fi fi fi fi ;;
#帮助与错误提示 *) if [ $# -eq 1 ] then if [ $1 = "help" ] then echo "Xcopy.sh 帮助:" else echo "错误的参数!" fi else echo "错误!" fi echo "Xcopy.sh [[参数]|[源目录 目标目录]]" echo "Xcopy.sh 向导模式" echo "Xcopy.sh help 查看帮助" echo "Xcopy.sh 源目录 目标目录 命令模式" ;; esac
如果哪位兄弟对上面的脚本有改进,请发一份给我,只有不断学习才能进步,谢谢。 我的邮箱是:superspecter007@yhaoo.com.cn,同时请您在修改、传播时保留致谢部分。 |