与 '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/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
-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删除文件的一个好方法,是我觉得与你分享的方法。
我看到这个问题越来越受欢迎了。 我在下面回答了我自己的问题。 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/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
-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删除文件的一个好方法,是我觉得与你分享的方法。