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

标签 linux bash cygwin

我很困惑。我有一个 linux 备份脚本,我以前使用 linux 作为我的主要操作系统时使用过。现在转到windows了,想继续在cygwin下使用。我已经将它移植过来,但我看到了一个特殊的问题。

正如您将在下面的代码中看到的,基本上我创建了一个文件夹结构/device/backups/machinename/。我已经概括了它,因此它通过 hostname 确定机器名称。如果文件夹结构不存在,它会创建它。我所看到的是该脚本通常可以正常工作,但它偶尔喜欢创建一个重复的机器名称文件夹,其后有一个奇怪的方 block 字符。该字符在 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

最佳答案

你应该删除 HOSTNAME=txtmsgbreakup

如果你想放一个字符串,试试这个:HOSTNAME="txtmsgbreakup" 或者如果你想要动态主机名,变量 $HOSTNAME 已经在你的环境。

根据我对您问题的理解,您希望使用字符串“txtmsgbreakup”定义 HOSTNAME,但是当您将它放在反引号 ` 中时,您要求运行一个不存在的命令。

此外,在您的 shell 变量中使用更多引号以避免(某天)出现问题

关于linux - Bash 在 Cygwin 中创建具有未知字符的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197906/

相关文章:

c# - 在 Linux Docker 容器中运行时无法读取证书 - 适用于 Windows

bash - 使用 echo 生成 bash 脚本,shebang 行有问题

bash - 修改 bash 脚本中的 $READLINE_LINE 和 $READLINE_POINT 值

Cygwin - 使用命令行安装程序安装特定的软件包版本

ssh - cygwin ssh不腻子是吗?

windows - 如何在 Windows 上安装 GnuPlot?

linux - 如何分配目录?

regex - awk:不显示匹配的正则表达式(多行)

c - 字符串比较的空白问题

bash - 无意转义的 GNU 并行转义字符