[转贴]一个用于SCO Unix系统的磁带拷贝程序

发表于:2007-05-26来源:作者:点击数: 标签:
[code:1:d5d54c4ced] 北京中软同和系统集成有限公司何绍德 在 Unix 系统中,除了使用软盘介质,光盘介质外,还广泛使用磁带介质。特别是在系统备份,数据备份中目前主要使用的还是磁带介质。因此会经常要作磁带的拷贝。 本文提供的程序tapecopy可以实现 Unix

[code:1:d5d54c4ced]

北京中软同和系统集成有限公司     何绍德


    在Unix系统中,除了使用软盘介质,光盘介质外,还广泛使用磁带介质。特别是在系统备份,数据备份中目前主要使用的还是磁带介质。因此会经常要作磁带的拷贝。
本文提供的程序tapecopy可以实现Unix系统中磁带对磁带的拷贝。该程序是用shell语言写成,并在SCO Unix系统中调试通过。由于该程序是用标准的shell语言写成,所以很容易移植到其它Unix系统上。
该程序的原理是利用Unix系统命令dd, 先把整个源磁带分为一个个文件拷贝到磁盘上,然后再把这些文件拷贝到目的磁带上,最后再把这些文件从磁盘上删除。
UNIX系统提供的dd命令,能将指定的输入文件拷贝到一个指定的输出文件上,并能进行格式转换。由于UNIX系统将输入/输出设备作为文件处理,因此可以用dd命令来复制软磁盘和磁带。下面给出dd命令的格式和主要选择项取值。
dd命令的格式:dd [ 选择项=值 ]
选择项 值
if=file             输入文件名;标准输入是缺省的。
of=file             输出文件名;标准输出是缺省的。
ibs=n            输入块大小为n个字节(缺省值为BSIZE)。
obs=n            输出块大小为n个字节(缺省值为BSIZE)
cbs=n             转换缓冲区大小
skip=n            跳过n个记录后输入
seek=n            跳过n个记录后输出
count=n        仅复制n个记录
dd命令是逐个记录读入输入文件,然后逐个记录写到输出文件上。在dd命令中,如果设定了数据块的大小(ibs, obs),一个记录就等于一个数据块的大小。如果没有设定选择项ibs, obs, 则一个记录为1024个字节。
    本程序使用SCSI磁带设备文件(/dev/nrStp0),如果使用其它磁带设备,请修改dd命令中磁带设备文件名。


程序tapecopy

/bin/echo " ********************************************************"
/bin/echo " * Wellcom to use the tape copy program *"
/bin/echo " * *"
/bin/echo " * Made by CS&S He Shao De *"
/bin/echo " * 1997.3 *"
/bin/echo " *********************************************************"
/bin/echo "\n"
/bin/echo "mounted file"
/bin/echo "system name available free disk spaces"
/bin/echo "----------- -----------------------------"
dfspace | grep "Disk space:" 
/bin/echo "-----------------------------------------------------------------------"
/bin/echo "\nPlease select a file system that its available free disk spaces"
/bin/echo "can hold your source tape size. If the available free disk spaces"
/bin/echo "can't hold source tape size, please key 'q' to quit."
/bin/echo "\nPlease entry the name of selected file system or key 'q' to quit: \c"
read filesys
if [ $filesys = "q" ]
then exit
fi
a="/"
if [ $filesys = "/" ]
then directory=$filesys
else directory=$filesys$a
fi
answer="n"
while [ $answer = "n" ]
do
/bin/echo "\nPlease insert your source tape."
/bin/echo "Are you ready [y/n]? \c"
read answer
done
tape rewind
fileseq=0
while :
do
fileseq=`expr $fileseq + 1`
filename=$directory$fileseq
dd if=/dev/nrStp0 of=$filename
[ -s $filename ] || break
done
answer="y"
flag=0
while [ $answer = "y" ]
do
if [ $flag -eq 0 ]
    then /bin/echo "\nPlease insert your blank tape"
    /bin/echo "Are you ready [y/n]? \c"
    read enter
if [ $enter != "y" ]
        then continue
    fi
    else /bin/echo "\nDo you like copy another tape [y/n]? \c"
    read enter
    if [ $enter = "y" ]
        then flag=0
        continue
        else answer="n"
        continue
    fi
fi
count=$fileseq
fileseq=1
tape rewind
while [ $fileseq -ne $count ]
do
    /bin/echo "\nIt is working on $fileseq"
    filename=$directory$fileseq
    dd if=$filename of=/dev/nrStp0
    fileseq=`expr $fileseq + 1`
done
flag=1
done
while [ $fileseq -ne 0 ]
do
filename=$directory$fileseq
rm -f $filename
fileseq=`expr $fileseq - 1`
done


北京中软同和系统集成有限公司
高级工程师 何绍德

地址:海淀区学院南路55号
邮编:100081
电话:62177722-2100
E_mail: hechude@public.bta.net.cn[/code:1:d5d54c4ced]

 纳兰婷 回复于:2003-11-09 15:41:34
北京中软同和系统集成有限公司     何绍德 这些都是原程序

原文转自:http://www.ltesting.net