web-dev-qa-db-ja.com

タイムスタンプ付きのZipファイルの作成

タイムスタンプ付きのディレクトリを圧縮して同じサーバー上の別の場所に移動するスクリプトを作成しようとしましたが、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
3
Reqx

そこにはいろいろな問題があります。

  • まず、コマンドdate +%b-%d-%yの結果をTESTDATE変数に割り当てます。これを行うには、 コマンド置換 を使用する必要があります:

    TESTDATE=$(date  +%b-%d-%y)
    

    スクリプトが現在実行しているのは、コマンドの結果ではなく、文字列date +%b-%d-%yTESTDATEに割り当てることです。これを実行してテストできます。

    TESTDATE="date +%b-%d-%y"
    echo $TESTDATE 
    

    date +%b-%d-%yを出力します。

  • 次に、使用すべきでない場所でコマンド置換を使用しています。必要なのは次のとおりです。

      zipfile="${DEST}/${TESTDATE} ${d} ${BASENAME}.Zip"
    

    したがって、括弧は必要ありません。また、そこでbasenameを使って何をしようとしているのかもわかりません。 basenameはデフォルトのプログラムであり、使用するために変数に配置する必要はありません。上記のコマンドは、zipfileを有効なファイル名ではない/volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basenameに設定します。あなたがbasenameで何をしようとしているのかを説明すれば、私は助けることができるかもしれませんが、それは意味がありません。

  • DIRSはリストだと思っているようですが、そうではありません。単なる単一のディレクトリ/volume1/NetBackupです。

  • もう一つのポイントはスタイルの問題です。環境変数はすべて大文字であり、同じ名前を使用すると問題が発生する可能性があるため、大文字の変数名の使用は常に避けてください。

とにかく、if私はあなたがここで何をしようとしているのか理解しています、あなたはこのようなスクリプトを書くことができます(私はdirsを私はそれがあなたが望んでいたものだと思うので配列):

#!/usr/bin/env bash

# date
testdate=$(date +%b-%d-%y)

# dirs to backup
dirs=("/volume1/NetBackup" "/volume1/foobar")

# 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
Zip=/usr/syno/bin/Zip

base=$(/usr/bin/basename ${dest})
echo "bb $base";

for d in ${dirs[@]}
do
    ## I assume this is what you wanted to do, it will just
    ## return the name of the current $d directory
    base=$(/usr/bin/basename ${d})
    zipfile="${dest}/${testdate} ${base}.Zip"
    echo -n "Creating $d $zipfile..."
    # create Zip file
    ${Zip} -r $zipfile $d  && echo "Done!" || echo ""
done

上記のサンプルスクリプトは、/volume1/NetBackup/Backup/Mar-05-14 NetBackup.Zip/volume1/NetBackup/Backup/Mar-05-14 foobar.Zipを作成します。ちなみに、スペースを入れたファイル名は作成しないことを強くお勧めします。後で感謝します。

5
terdon