Ошибка 'rm: отсутствует операнд' при использовании вместе с командой 'find'

Я вижу, что этот вопрос становится популярным. Я ответил на свой вопрос ниже. То, что говорит 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, проблема может быть где-то еще. Я проверяю их все. Все вышеперечисленные коды работают, но лучший ответ - тот, который помечен;)

3 ответа

Решение

Проблема при использовании find/grep вместе с xargs Вы должны быть уверены, что выполнили команду piped, только если предыдущая команда была успешной. Как и в приведенном выше случае, если find Команда не дает никаких результатов поиска, rm Команда вызывается с пустым списком аргументов.

man страница из xargs

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

Зачем? Я ищу все старые папки, которые хочу удалить, и распечатываю их все в файл, независимо от их имен с пробелами или без них. Если файл больше 0 байт, это означает, что есть папка, которую я не хочу больше.

Если ваш 'FIND' завершается с ошибкой 'rm: отсутствующий операнд', он, вероятно, не ищет в RM, а в самом FIND. Хороший способ удаления файла с помощью FIND - это тот, которым я хотел поделиться с вами.

Другие вопросы по тегам