与“查找”命令一起使用时出现错误“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/grep
和xargs
时,您需要确保只有在前一个命令成功时才运行管道命令。与上述情况一样,如果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
【讨论】:
【参考方案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 一起使用时出现类型错误