
これは簡単であることを知っていますが、解決策を見つけることができないようで、これが私を狂わせます。ああ!新しいバックアップを実行する前に、古いファイルを削除するようにスクリプトに 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 {} ;"
答え2
find [...] -exec rm
以下を使用する代わりに、組み込み関数を使用することをお勧めします。
find [...] -delete
マニュアルから:
-delete
Delete found files and/or directories. Always returns true. This executes
from the current working directory as find recurses down the tree. It will
not attempt to delete a filename with a ``/'' character in its pathname
relative to ``.'' for security reasons. Depth-first traversal processing
is implied by this option. Following symlinks is incompatible with this
option.
(ところで、質問の命令が削除されることをご存知ですか?どの最後に修正してから3日以上経過したファイルですか? )