与 'find' 命令一起使用时出现错误 'rm: missing operand'

Error 'rm: missing operand' when using along with 'find' command

我看到这个问题越来越受欢迎了。 我在下面回答了我自己的问题。 Inian 是正确的,它帮助我更好地分析我的源代码。

我的问题出在 FIND 而不是 RM。我的回答给出了一段代码,我目前正在使用的代码块,以避免当FIND找不到任何东西但仍然会向RM传递参数时出现问题,导致上述错误。

下面是老问题

我正在编写同一命令的许多不同版本。 全部执行,但带有 error/info:

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,问题可能出在其他地方。我正在检查所有这些。以上所有代码均有效,但最佳答案是标记为 ;)

的代码

问题是当 find/grepxargs 一起使用时,您需要确保仅当前一个命令成功时才 运行 管道命令。与上述情况一样,如果 find 命令未产生任何搜索结果,则会使用空参数列表调用 rm 命令。

xargs

man
 -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

-f rm 选项抑制 rm: missing operand 错误:

-f, --force 
       ignore nonexistent files and arguments, never prompt

经过研究,我习惯使用的命令是:

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}

为什么? 我搜索了所有我想删除的旧文件夹并将它们全部打印到一个文件中,无论它们的命名是否带有 space。如果文件大于 0 字节,这意味着有我不想要的文件夹。

如果您的 'FIND' 因 'rm: missing operand' 而失败,则可能不是在 RM 中搜索,而是在 FIND 本身中搜索。 使用FIND删除文件的一个好方法,是我觉得与你分享的方法。