与“查找”命令一起使用时出现错误“rm:缺少操作数”

Posted

技术标签:

【中文标题】与“查找”命令一起使用时出现错误“rm:缺少操作数”【英文标题】:Error 'rm: missing operand' when using along with 'find' command 【发布时间】:2016-08-05 16:56:43 【问题描述】:

我看到这个问题越来越受欢迎。 我在下面回答了我自己的问题。 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,问题可能出在其他地方。我正在检查所有这些。以上所有代码都有效,但最好的答案是标记的;)

【问题讨论】:

Ignore empty result for xargs的可能重复 您的问题应该是一个问题。我会恢复您的编辑,但我希望让您有机会在回滚更改之前发布您的新文本作为答案。 (显然,它仍可从您通过单击“已编辑(日期)”通知获得的编辑历史记录中获得。) @tripleee 你好,我编辑了这篇文章。我希望我做得对!感谢您的关注 这是一个改进,尽管我仍然很想删除评论,或者将其移至您的答案。不过,感谢您的修复! 【参考方案1】:

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

xargsman页面

 -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

【讨论】:

【参考方案2】:

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

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

【讨论】:

在没有什么可运行的情况下,根本不调用rm 在语义上更正确。【参考方案3】:

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

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' 而失败,则可能不是在 RM 中搜索,而是在 FIND 本身中搜索。 使用 FIND 删除文件的一种好方法是我觉得要与您分享的方法。

【讨论】:

以上是关于与“查找”命令一起使用时出现错误“rm:缺少操作数”的主要内容,如果未能解决你的问题,请参考以下文章

将 Firebase 与 RecyclearView 一起使用时出现错误

将 Typescript 与 React-Redux 一起使用时出现类型错误

将 retfofit 与 MVVM 一起使用时出现错误

将 join 与 delete 语句一起使用时出现语法错误 [重复]

将折线与本机地图一起使用时出现空引用错误

将mysql与pythonanywhere一起使用时出现错误4