1. ホーム
  2. bash

[解決済み] findコマンドと一緒に使用するとエラー 'rm: missing operand' が発生する。

2022-03-04 18:16:05

質問

この質問は人気があるようですね。 以下、私自身の質問にお答えします。 何が言いたいかというと イニアン は正しく、私のソースコードをより良く分析するのに役立ちました。

私の問題は FIND であって RM . 私の回答は、FINDが何も見つけないのにRMに引数を渡してしまい、上記のエラーを引き起こす問題を避けるために、私が現在使用しているコードのブロックを示しています。

以下、古い質問

同じコマンドを何度も何度もバージョンアップして書いています。 すべて、実行されますが、エラー/インフォメーションがあります。

rm: missing operand
Try 'rm --help' for more information.

以上が、私が使っているコマンドです。

#!/bin/bash
BDIR=/home/user/backup
find ${BDIR} -type d -mtime +180 -print -exec rm -rf {} \;
find ${BDIR} -type d -mtime +180 -print -exec rm -rf {} +
find "$BDIR" -type d -mtime +180 -print -exec rm -rf {} \;
find "$BDIR" -depth -type d -mtime +180 -print -exec rm -rf {} \;
find ${BDIR} -depth -type d -mtime +180 -print -exec rm -rf {} +

find $BDIR -type d -mtime +180 -print0 | xargs -0 rm -rf

DEL=$(FIND $BDIR -type d -mtime +180 -print)
rm -rf $DEL

これらはすべて正しいと思います(なぜなら、これらはすべて自分の仕事をしてくれるからです)。手動で実行すると、そのメッセージは戻ってきませんが、.shスクリプトの中では戻ってきます。

EDIT: このRMをたくさん持っているので、問題は他のところにあるのかもしれません。全部チェックしています。上記のコードはすべて動作しますが、ベストアンサーはマークされたものです;)

解決方法は?

この問題は find/grep と共に xargs の場合、パイプでつながれたコマンドは、前のコマンドが成功した場合にのみ実行されることを確認する必要があります。上の例のように、もし find コマンドで検索結果が出なかった場合 rm コマンドは、空の引数リストで起動されます。

man のページがあります。 xargs

 -r      Compatibility with GNU xargs.  The GNU version of xargs runs the
         utility argument at least once, even if xargs input is empty, and
         it supports a -r option to inhibit this behavior.  The FreeBSD
         version of xargs does not run the utility argument on empty
         input, but it supports the -r option for command-line compatibil-
         ity with GNU xargs, but the -r option does nothing in the FreeBSD
         version of xargs.

また、貼り付けたようなコマンドをすべて試す必要はなく、以下のようなシンプルなものが適していると思います。

を追加します。 -r のように xargs に引数を与えます。

find "$BDIR" -type d -mtime +180 -print0 | xargs -0 -r rm -rf