1

我正在尝试创建一个 bash 脚本,将整个 /dev/sda1 备份到 /mnt/Backup

/dev/sda1       457G  3.5G  431G   1% /
/dev/sdb1       2.8T  3.0G  2.8T   1% /mnt/Backup

有的脚本是:

START=$(date +%D)
FOLDER_NAME=`echo $START | tr -s '/' | tr '/' '_'`
SOURCE_PATH='/media /bin /boot /cdrom /dev /etc /home /lib /opt /proc /root /run /sbin /selinux /srv /sys /tmp /usr /var'
SOURCE_PATH='/'
FOLDER_PATH='/mnt/Backup'
BACKUP_PATH=$FOLDER_PATH/Bkp_$FOLDER_NAME
mkdir -p '$BACKUP_PATH'
cp -r $SOURCE_PATH $BACKUP_PATH

正如您在上面的源路径中看到的那样,我尝试命名所有要备份的文件夹,但是当我使用该路径运行时出现错误:这不是目录

然后我尝试了下面的源路径“/”并开始复制,但被卡住了

cp: reading `/proc/sysrq-trigger': Input/output error
cp: failed to extend `/mnt/Backup/Bkp_09_14_13/proc/sysrq-trigger': Input/output error

问题是如何更改我的脚本以成功将 sda1 备份到 sdb1

在此先感谢您的帮助

4

2 回答 2

0

我不确定您的实际程序,但这里有一些小事情:

START=$(date +%D)
FOLDER_NAME=`echo $START | tr -s '/' | tr '/' '_'`

两者都$()` `的完全一样。为什么要在一个脚本中同时使用两者?更喜欢$()反引号,因为它们可以嵌套。另外,有什么意义tr -s '/'?首先,可以浓缩为一个tr:

echo "$START" | tr -s '/' '_'

但是考虑到date +%D永远不会返回重复的斜杠,您可以使用纯 bash 参数扩展:

FOLDER_NAME=${START//\//_}

这怎么可能工作:mkdir -p '$BACKUP_PATH'?单引号中的变量不展开。改成mkdir -p "$BACKUP_PATH"

$SOURCE_PATH不需要引号cp -r $SOURCE_PATH $BACKUP_PATH,因为您希望将其拆分为不同的参数。没错。但是您必须这样做,$BACKUP_PATH因为您希望它是单个参数。

因此,这是您的脚本,有一些小的改进:

START=$(date +%D)
FOLDER_NAME=${START//\//_}
SOURCE_PATH='/media /bin /boot /cdrom /dev /etc /home /lib /opt /proc /root /run /sbin /selinux /srv /sys /tmp /usr /var'
SOURCE_PATH='/'
FOLDER_PATH='/mnt/Backup'
BACKUP_PATH=$FOLDER_PATH/Bkp_$FOLDER_NAME
mkdir -p "$BACKUP_PATH"
cp -r $SOURCE_PATH "$BACKUP_PATH"
于 2013-09-15T00:02:43.633 回答
0

如果/dev/sda1作为根文件系统挂载,则对其进行递归复制还将在其目录下包含已挂载的文件系统。您可以将它再次挂载到另一个目录,例如/mnt/system,然后从中进行递归复制。我建议使用cp -a,而不仅仅是-r

于 2013-09-14T20:27:52.010 回答