タイムスタンプ付きの zip ファイルを作成する

タイムスタンプ付きの 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

答え1

そこにはさまざまな問題があります。

  • まず、コマンドの結果を変数date +%b-%d-%yに代入しますTESTDATE。そのためには、コマンド置換:

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

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

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

    印刷されますdate +%b-%d-%y

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

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

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

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

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

ともかく、もしここで何をしようとしているのかは理解しています。次のようにスクリプトを記述できます (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。ちなみに、スペースを含むファイル名を作成しないように強くお勧めします。後で感謝することになるでしょう。

関連情報