我有一个备份目录,该目录下有一个tar文件(/home/username/userhome/backup/userbackup-${currentdate}.tar.gz)。我想创建一个脚本:
- 如果恢复目录不存在,则创建恢复目录
- 显示包含先前备份 的tar文件的备份目录的内容。
- 要求用户输入要恢复的tar文件的名称
- 使用tar命令将文件恢复到新的恢复目录和日志文件
到目前为止,我的脚本有
#!/bin/bash
mkdir restore -p
ls /home/username/userhome/backup
echo "Enter the file name to be restored"
read $filename
tar xvf "/home/username/userhome/restore/$filename" &>/home/username/userhome/restore/restore.log
我是一个完全的新手,所以任何帮助都会非常感激。
继续评论,在编写脚本时,您总是想要做的一件事是验证过程中的每一步。例如,如果您不能创建新的restore
目录,那么您不希望循环然后尝试将tar.gz文件解压缩到不存在的目录中。
几乎所有的命令成功时返回0
,失败时返回非零错误。您可以利用这一点来检查命令是否成功,如果没有,则直接退出。一个快速的方法是:
command || exit 1
在您的示例中,创建的restore
目录可以是:
mkdir -p restore || exit 1
如果您愿意,可以添加额外的错误消息,但大多数情况下,故障产生的错误足以告诉您哪里出错了。
当您使用该基目录的子目录操作固定的基目录时,最好为该基目录创建一个变量,以便在脚本中使用。例如:
#!/bin/bash
userdir="${1:-/home/username/userhome}"
budir="$userdir"/backup
restore="$userdir"/restore
这里userdir
是基本目录,对于备份目录和恢复目录有额外的变量。这样可以方便地引用或操作任何目录中的文件。还要注意userdir
是如何从第一个命令行参数设置的,或者在没有给出参数的情况下默认使用/home/username/userhome
。
您可以创建restore
并更改到该目录,验证每个步骤如下:
mkdir -p restore || exit 1
cd "$restore" || exit 1
对于菜单,让select
为您创建菜单(现在如果您有数百个.tar.gz
文件,您可能需要编写自定义分页器,但对于几十个文件,select
就可以了)。您可以使用以下命令生成菜单并恢复所选文件:
select choice in "$budir"/*.tar.gz; do
tar -xvf "$choice" &>"$restore/restore.log"
break
done
把它们放在一起,你会有:
#!/bin/bash
userdir="${1:-/home/username/userhome}"
budir="$userdir"/backup
restore="$userdir"/restore
mkdir -p restore || exit 1
cd "$restore" || exit 1
select choice in "$budir"/*.tar.gz; do
tar -xvf "$choice" &>"$restore/restore.log"
break
done
使用/输出示例
假设我在一个目录中有几个.tar.gz
文件,例如
$ tree /home/david/tmpd/backup
backup
├── v.tar.gz
└── x.tar.gz
然后在tmpd
目录下创建一个恢复目录,我可以运行以下脚本:
$ bash ~/scr/tmp/restore.sh /home/david/tmpd
1) /home/david/tmpd/backup/v.tar.gz
2) /home/david/tmpd/backup/x.tar.gz
#? 2
通过选择2
上面的x.tar.gz
文件被恢复到restore
目录下,例如
$ ls -al restore/
total 4
drwxr-xr-x 3 david david 80 Oct 29 01:00 .
drwxr-xr-x 4 david david 80 Oct 29 01:00 ..
drwxr-xr-x 3 david david 60 Oct 29 01:00 home
-rw-r--r-- 1 david david 57 Oct 29 01:00 restore.log
因此,restore
目录创建成功,restore.log
创建成功,.tar.gz
文件恢复到restore
目录下。
restore.log
的内容为
$ cat restore/restore.log
home/david/scr/utl/xscrd.sh
home/david/scr/utl/xzdate.sh
(这是我添加到x.tar.gz
文件中的两个示例文件)
请过目一遍,如果还有问题请告诉我。