これは簡単であることを知っていますが、解決策を見つけることができないようで、これが私を狂わせます。ああ!新しいバックアップを実行する前に、古いファイルを削除するようにスクリプトに find コマンドを追加するだけです。正確なコマンドを入力するよりも、変数を介して制御する方が良いです。変数を使用する代わりにスクリプトにコマンドを入力すると、そのコマンドはスクリプトで機能します。
FIND="/usr/bin/find"
BUILD="~/"
FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
echo $find $BUILD $FINDOPTS
## remove the 2 week old backup
echo "Removing old backups... "
$FIND $BUILD $FINDOPTS
コマンドを単にエコーすると、$FIND $BUILD $FINDOPTS
私が入力したときと同じように表示されます。唯一の違いは、私が入力すると実際に実行されることです。
タイピングは/usr/bin/find ~/ -type f -mtime +3 -exec rm -rf {} \;
うまくいきます。
私が得るエラーは次のとおりです。
/usr/bin/find: missing argument to `-exec'
なぜこれを説明できる人がいますか?ありがとうございます!
ベストアンサー1
全体的にはより良い解決策がありますが、このスクリプトは次の理由で失敗します。
FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
^
待機するパラメータはfind
文字です;
。 (偶然ではないから;
)返品シェルコマンド内でエスケープする必要があるため、通常は入力するシェルのコマンド終了区切り文字です\;
。この文字を変数に入れると、シェルはそれを区切り文字として評価しません。したがって、カント脱出しました。
変数なしでエラーを再現します。
$ find /etc -exec ls "\;"
find: missing argument to `-exec'
したがって、文字列を次のように置き換えます。
FINDOPTS="-type f -mtime +3 -exec rm -rf {} ;"