タイムスタンプ付きのディレクトリを圧縮して同じサーバー上の別の場所に移動するスクリプトを作成しようとしましたが、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
そこにはいろいろな問題があります。
まず、コマンド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
はデフォルトのプログラムであり、使用するために変数に配置する必要はありません。上記のコマンドは、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
を作成します。ちなみに、スペースを入れたファイル名は作成しないことを強くお勧めします。後で感謝します。