私が作成しているバックアップファイルを管理するルーチンを作成し、プロセス中に古いフォルダが自動的に削除されるようにします。これが私が得るものです:
#!/bin/sh
day=$(date +%m%d%y)
oldday=$(date -d "-4 days" +%m%d%y)
mkdir /home/fauna/backup/$day
rm -r /home/fauna/backup/$oldday
cp /home/fauna/backup/backup.sh /home/fauna/backup/$day
cd /home/fauna/backup/$day
./backup.sh
backup.sh
実際にバックアップファイルを作成したら、そのファイルを含むフォルダをリモートの場所にコピーします。
このrm
行は、意図しない結果なしで古いフォルダを削除しますか?
に移動できます。後ろにワイヤーbackup.sh
?
答え1
小切手を追加することをお勧めします。
if [[ -d ~/backup/$oldday ]]; then
rm -rf "$HOME/backup/$oldday"
fi
また、bashでは、一重引用符または二重引用符を正しく使用することが重要です。スペースを含むディレクトリ名は、特に引用符を使用しないと問題を引き起こす可能性があります。
更新:OPがbashを使用したいとします。
答え2
コードのコーディング方法にはいくつかの問題があります。
- 特に、次のコマンドが前のコマンドの成功に依存する場合は、これらのコマンドの成功を確認する必要があります。
- リストコンテキストで引用されていない変数を維持することは、シェルにそれを分割してファイル名の生成を要求することです。ここではこれを行う理由はありません。
現時点では、rm -r
ディレクトリとその内容の両方を削除することを意味します。これを行うときは、シンボリックリンクに従わないでください。シンボリックリンクであっても/home/fauna/backup/$oldday
シンボリックリンクのみが削除されます。これはあなたが望むものかもしれません。rm -r "/home/fauna/backup/$oldday/"
(末尾を使用して)これは/
状況を変えます。
ただし、そうでない場合は、-f
stdinが端末の場合は書き込み不可能なファイルを削除するように求められます。したがって、無人スクリプトであれば追加する必要があります。同様に-f
、rm
ディレクトリがまだ存在する場合にのみ失敗が報告されます。
#!/bin/sh -
day=$(date +%m%d%y) || exit
oldday=$(date -d "-4 days" +%m%d%y) || exit
# date is very unlikely to fail, but if it does, it would have dramatic consequences
# shouldn't access to those directories be restricted (if it hasn't been
# restricted already some levels above)?
# umask 077
mkdir -p "/home/fauna/backup/$day" || exit
# with -p, mkdir would only fail if the directory is not there after that call.
# It may not be what you want though. You may want mkdir to fail if the
# directory already existed in which case you'd want to omit the -p.
cp /home/fauna/backup/backup.sh "/home/fauna/backup/$day" || exit
cd "/home/fauna/backup/$day" || exit
./backup.sh || exit
# only delete the old one if the new one succeeds.
rm -rf "/home/fauna/backup/$oldday"
|| exit
ここではすべてのコマンドに追加するので、コマンドを使用してエラーが発生した場合にset -e
シェルを終了させることもできます。多すぎるトラップは安定して使用できません(ただし、この単純な場合はそうではありません)。|| exit
set -e