bashスクリプトでfindと-exec rmを使用すると失敗しますが、プロンプトでは機能します。

bashスクリプトでfindと-exec rmを使用すると失敗しますが、プロンプトでは機能します。

これは簡単であることを知っていますが、解決策を見つけることができないようで、これが私を狂わせます。ああ!新しいバックアップを実行する前に、古いファイルを削除するようにスクリプトに 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 {} ;"

おすすめ記事