web-dev-qa-db-ja.com

「find」コマンドと一緒に使用すると、エラー「rm:オペランドがありません」

この質問が一般的になっているようです。以下に自分の質問に答えました。 Inianと言うのは正しいことであり、ソースコードをよりよく分析するのに役立ちました。

私の問題は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スクリプトでは私はそうします。

編集:私はこれらのRMの多くを持っているので、問題は他のどこかにある可能性があります。私はそれらすべてをチェックしています。上記のコードはすべて機能しますが、最良の答えはマークされたものです;)

15
Nihvel

問題は、find/grepとともにxargsと共に、前のコマンドが成功した場合にのみパイプコマンドを実行する必要があります。上記の場合と同様に、findコマンドが検索結果を生成しない場合、rmコマンドは空の引数リストで呼び出されます。

manxargsページ

 -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
27
Inian

rm-fオプションは、rm: missing operandエラーを抑制します。

-f, --force 
       ignore nonexistent files and arguments, never Prompt
5
Jingguo Yao

調査後、私が使いやすいコマンドは次のとおりです。

HOME=/home/user
FDEL=$HOME/foldersToDelete
BDIR=/backup/my_old_folders
FLOG=/var/log/delete_old_backup.log
find ${BDIR} -mindepth 1 -daystart -type d -mtime +180 -printf "%f\n" > ${FDEL}
if [[ $? -eq 0 && $(wc -l < ${FDEL}) -gt 0 ]]; then
    cd ${BDIR}
    xargs -d '\n' -a ${FDEL} rm -rf
  LOG=" - Folders older than 180 were deleted"
else
  LOG=" - There aren't folders older than 180 days to delete"
fi
echo ${LOG} >> ${FLOG}

理由?削除するすべての古いフォルダーを検索し、それらの名前をスペースの有無に関係なくすべてファイルに印刷します。ファイルが0バイトより大きい場合、これは私がこれ以上欲しくないフォルダがあることを意味します。

「FIND」が「rm:missing operand」で失敗した場合、おそらくFIND自体ではなくRMで検索することではないでしょう。 FINDを使用してファイルを削除する良い方法は、あなたと共有したいと思った方法です。

1
Nihvel