我很困惑。我有一个linux备份脚本,我习惯使用linux作为我的主要操作系统。现在我已经搬到了windows,我想继续在cygwin下使用它。我把它移植了,但我看到了一个奇怪的问题。
正如您在下面的代码中看到的,基本上我创建了一个文件夹结构/ device / backups / machinename /。我已将其概括为通过hostname
确定机器名称。如果文件夹结构不存在,则会创建它。我所看到的是脚本通常正常工作,但它偶尔会喜欢创建一个带有奇数方形字符的重复机器名称文件夹。此字符在cygwin中显示为问号。所以,我会看到:/ device / backups / machinename和/ device / backups / machinename?同时。 Cygwin似乎在这两个文件夹之间感到困惑,有时备份到第一个文件夹,有时备份到第二个文件夹。它也不会一致地创建这个文件夹,但如果我让事情每天都运行一周,它就会显示出来。
另请注意,它设计为基于每个文件夹运行,文件夹名称作为参数传入。以FolderName.0.tar.gz,FolderName.1.tar.gz等格式保存一周的档案。
我现在要尝试通过硬编码机器名来解决它,但我真的很想知道问题是什么。这是我脚本的来源:
#!/bin/bash
#Backup Docs
for FOLDER in $@
do
# Location of folder to be backed up
FOLDERLOCATION="/home/sean"
# Mount point of the backup device
DEVICE="/cygdrive/f"
# Hostname of the machine being backed up
HOSTNAME=`hostname`
# NOTE: when I originally posted this question, the above line read:
# HOSTNAME=`txtmsgbreakup`
# which doesn't make any sense. I failed at changing the hard-coded solution back
# to the original command that produces the string "txtmsgbreakup" (my system's name)
BACKUPFOLDER="$FOLDERLOCATION/$FOLDER/"
BACKUPDEST="$DEVICE/backups/$HOSTNAME/$FOLDER/"
# Check to see if device is mounted
if [ -d $DEVICE ]
then
# Create directory if necessary
if [ ! -d $BACKUPDEST ]; then
mkdir -p $BACKUPDEST
fi
# Capture before time for logging
before=$(date +%s)
# First, tar up the old into file named after day of week
DOW=`date +%w`
FILENAME="$DEVICE/backups/$HOSTNAME/$FOLDER.$(( ($DOW+6)%7 )).tar.gz"
if [ -e $FILENAME ]; then
rm $FILENAME
fi
tar -czPf $FILENAME $BACKUPDEST
# Now perform the backup
rsync -a --del --ignore-errors $BACKUPFOLDER $BACKUPDEST
after=$(date +%s)
# Calculate how long the backup took
elapsed_seconds=$(($after-$before))
es=$((elapsed_seconds % 60))
em=$(( (elapsed_seconds / 60) % 60 ))
eh=$((elapsed_seconds / 3600 ))
# Write it all to the system log
echo "$(date) - $BACKUPFOLDER backed up. Elapsed time: $(printf '%02d:%02d:%02d' $eh $em $es)" >> /var/log/backup
else
#External is not mounted if this branch is executed, log this.
echo "$(date) - $BACKUPFOLDER not backed up: Backup device not mounted." >> /var/log/backup
fi
done
答案 0 :(得分:0)
您应该删除HOSTNAME=
txtmsgbreakup
如果您想要输入字符串,请尝试: HOSTNAME =“txtmsgbreakup”,或者如果您需要动态主机名,则变量 $ HOSTNAME 已在你的环境。
在我对你的问题的理解中,你想要用字符串“txtmsgbreakup”定义HOSTNAME,但是当你把它放在反向词`中时,你要求运行一个不存在的命令。
Morevover,在shell变量中使用更多引号以避免事情破坏(某天)