创建带有时间戳的 zip 文件

Req*_*eqx 3 unix zip script shell date-time

我一直在尝试创建一个脚本,该脚本压缩带有时间戳的目录并将其移动到同一服务器上的另一个位置,但我似乎无法让 TESTDATE 显示在 zip 文件上,从而导致文件名称为 .zip。

#!/bin/sh

# date
TESTDATE="date +%b-%d-%y"

# dirs to backups
DIRS="/volume1/NetBackup"

# Save zip file elsewhere on the server
DEST="/volume1/NetBackup/Backup"

# set to "no" keep old zip file and add new file
DELETE_OLD_ZIP_FILES="no"

#Path to binary files
BASENAME=/usr/bin/basename
ZIP=/usr/syno/bin/zip

for d in $DIRS
do
echo $DIRS
    zipfile="${DEST}/$(${TESTDATE} ${d} ${BASENAME}).zip"
    echo -n "Creating $zipfile..."
            # create zip file
                ${ZIP} -r $zipfile $d &>/dev/null && echo "Done!"
                done
Run Code Online (Sandbox Code Playgroud)

ter*_*don 5

你有各种各样的问题。

  • 首先,你要分配的命令的结果date +%b-%d-%yTESTDATE变量。为此,您需要使用命令替换

    TESTDATE=$(date  +%b-%d-%y)
    
    Run Code Online (Sandbox Code Playgroud)

    您的脚本当前正在做的是将字符串date +%b-%d-%y分配给TESTDATE,而不是命令的结果。您可以通过运行以下命令进行测试:

    TESTDATE="date +%b-%d-%y"
    echo $TESTDATE 
    
    Run Code Online (Sandbox Code Playgroud)

    这将打印date +%b-%d-%y.

  • 其次,您在不应该使用的地方使用命令替换,您想要的是:

      zipfile="${DEST}/${TESTDATE} ${d} ${BASENAME}.zip"
    
    Run Code Online (Sandbox Code Playgroud)

    所以,你不想要括号。我也不知道你想在basename那里做什么。basename是默认程序,您无需将其放在变量中即可使用。上面的命令将 zipfile 设置/volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basename为无效的文件名。如果你解释你试图用 basename 做什么,我可能会提供帮助,但实际上它没有意义。

  • 你似乎认为那DIRS是一个列表,其实不是,它只是单个目录/volume1/NetBackup

  • 另一点是风格问题。您应该始终避免使用 CAPITAL 变量名,因为环境变量都是大写的,如果您使用相同的名称,这可能会导致问题。

无论如何,如果我理解你在这里想要做什么,你可以像这样编写脚本(我已经制作dirs了一个数组,因为我认为这就是你想要的):

TESTDATE=$(date  +%b-%d-%y)
Run Code Online (Sandbox Code Playgroud)

上面的示例脚本将创建/volume1/NetBackup/Backup/Mar-05-14 NetBackup.zip/volume1/NetBackup/Backup/Mar-05-14 foobar.zip. 顺便说一句,我还强烈建议您避免使用空格创建文件名,稍后您会感谢我。