在Cygwin中创建Bash,创建具有未知字符的文件夹

时间:2011-11-19 22:39:38

标签: linux bash cygwin

我很困惑。我有一个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

1 个答案:

答案 0 :(得分:0)

您应该删除HOSTNAME= txtmsgbreakup

如果您想要输入字符串,请尝试: HOSTNAME =“txtmsgbreakup”,或者如果您需要动态主机名,则变量 $ HOSTNAME 已在你的环境。

在我对你的问题的理解中,你想要用字符串“txtmsgbreakup”定义HOSTNAME,但是当你把它放在反向词`中时,你要求运行一个不存在的命令。

Morevover,在shell变量中使用更多引号以避免事情破坏(某天)